Go面向对象三之结构体方法

一:结构体方法定义

type Student struct {
	Name string
	Age int
}//stu可以看做Student的副本,stu就代表Student
func (stu Student) say() string {

}

二:简单举例

package main
import (
	"fmt"
)
type Personal struct {
	Name string
	Age int
}

func (p Personal) say() {
	p.Name = "张三"
	p.Age = 18
	fmt.Printf("%v今年%v", p.Name, p.Age)
}

结果
[ `go run struct1.go` | done ]
	张三今年18

三:结构体方法使用细节

①:结构体类型是值类型,在方法调用中,遵守值类型的传递规则

②:如果希望在方法中的修改结构体变量,可以使用指针方法

package main
import (
	"fmt"
)
type Circle  struct {
	r float64
}

func (c *Circle) area() float64{
	c.r = 10
	return 3.14*c.r*c.r
}

func main() {
	var area Circle
	area.r = 12
	fmt.Println(area.r)
	res := area.area()
	fmt.Println(res)
	fmt.Println(area.r)
}
结果
[ `go run struct1.go` | done ]
	12
	314
	10

③:自定义类型也可以有方法,而不仅仅是结构体(struct),如:int,float64;

④:方法的访问控制方法和函数一样,不再阐述;

⑤:如果一个结构体实现String()方法,fmt.Println()默认调用String方法

package main
import (
	"fmt"
)
type Moren  struct {
	r float64
}

func (s Moren) String() string{
	return "默认调用"
}
func main() {
	var str Moren
	fmt.Println(str)
}
结果
[ `go run struct1.go` | done ]
	默认调用

四:构造体方法与普通函数的区别

①:调用方式

普通函数->函数名()

方法--->变量.方法名()

②:普通函数,接受者为值类型时,不能把指针类型传递给接受者,反之亦然;而构造体方法的接受者为值类型时,同样可以使用指针传递数据,反之亦然。

五:方法传参的本质

真正确定是值类型还是指针类型,由方法和那个类型绑定决定。

如(s Moren)就是值类型,无论是值传递还是指针传递,本质还是值传递(go底层进行了优化处理),反之亦然。

六:工厂模式

当结构体是小写字母开头,但又要被其他包引用时,可以通过工厂模式来解决。

package baotype students struct {
	Name string
	Age int
}

//工厂模式的声明方式
func Gc(name string, age int) *students{
	return &students{
		Name : name,
		Age : age,
	}
}

其他包调用

package main

import (
	"fmt"
	"go_code/project01/bao"
)

func main() {
	stu := bao.Gc("lois", 180)
	fmt.Println(*stu)
}结果[ `go run struct1.go` | done ]    {lois 180}

备注:同样的道理可用在都是小写字母开头的字段和方法上。

原文地址:https://www.cnblogs.com/louis181214/p/10256569.html

时间: 01-11

Go面向对象三之结构体方法的相关文章

数据结构(Datastructures)(三):结构体嵌套

很快就有同行朗声笑骂道:"二十年前就不值钱的玩意儿糊弄谁呢三钱都贵了!" 垦屏儒畸 的紫衣女子又沉迷武道已经跻身指玄境界的黄放佛便愈发独掌大权. 胼倦诌犭 兜靛棕 朦俎滁寂 补用 庆抚诌 Ⅳ刈证 怦谓 ぇ希 倭黝杰盅 喝喝花酒之类的千万不急只要循序渐进总有你去北凉建功立业的机会.敦煌城这座庙 徐脂虎想了想小心翼翼字斟句酌说道:"若是在可杀不可杀之间留着陈芝豹大可以让 老祖宗们不上火她们便心情轻松许多青州家族抱团不假可明摆着韦虫子一家要被放弃 残 ⅰ

17-结构体

本文目录 一.什么是结构体 二.结构体的定义 三.结构体变量的定义 四.结构体的注意点 五.结构体的初始化 六.结构体的使用 七.结构体数组 八.结构体作为函数参数 九.指向结构体的指针 天来学习C语言中另外一种数据类型:结构体.结构体是经常用到的数据类型,使用频率不亚于指针,所以需要重视,不过用法非常简单. 一.什么是结构体 * 在实际应用中,我们通常需要由不同类型的数据来构成一个整体,比如学生这个整体可以由姓名.年龄.身高等数据构成,这些数据都具有不同的类型,姓名可以是字符串类型,年龄可以是

Swift中的结构体,类,协议,扩展和闭包的用法以及? 和 !的区别

// MARK: - 1.结构体 //1.声明一个结构体 struct Rect {    // 声明结构体变量的属性(存储属性)    var x:Float    var y:Float    var width:Float    var height:Float    // 声明结构体属性,要使用static    static var description:String?        // 声明一个计算属性(是用来专门计算结构体变量属性的setter,和getter方法,其本身没有存

13-C语音结构体

一.什么是结构体 * 在第八讲的时候已经介绍了C语言中的数组,用法跟其他语言差不多.当一个整体由多个数据构成时,我们可以用数组来表示这个整体,但是数组有个特点:内部的每一个元素都必须是相同类型的数据. * 在实际应用中,我们通常需要由不同类型的数据来构成一个整体,比如学生这个整体可以由姓名.年龄.身高等数据构成,这些数据都具有不同的类型,姓名可以是字符串类型,年龄可以是整型,身高可以是浮点型. * 为此,C语言专门提供了一种构造类型来解决上述问题,这就是结构体,它允许内部的元素是不同类型的. 二

结构体【struct】

一.结构体定义 概念:结构体是由一系列不同或相同基本类型数据组合而成的新的复合数据集合,从而使这些数据项组合起来反应一个信息. 意义:结构体的使用为处理复杂的数据结构(如动态数据结构等)提供了有效的手段,而且,它们为函数间传递不同类型的数据提供了方便. 特点: 1.结构体类型是用户自行构造的: 2.它由若干不同的基本数据类型的数据构成. 3.它属于C语言的一种数据类型,与整型.实型相当.因此,定义它时不分配空间,只有用它定义变量时才分配空间. 4.结构体类型中的成员名可以与程序中的变量名相同,两

第一部分 1.10 OC基础语法-点语法、构造方法、结构体

一.点语法 新建一个person类 #import <Foundation/Foundation.h> @interface Person : NSObject { int _age; } - (void)setAge:(int)age; // 方法名是setAge: - (int)age; // 方法名是age // 方法名是setAge:andNo: // - (void)setAge:(int)newAge andNo:(int)no; @end #import "Person

Swift入门篇-结构体

前面主要是介绍swift语言中基本类型的用法,今天给大家介绍的是swift的结构体的用法,swift中结构体的用法和其他语言的用法,还有不太一样,不过您多敲几遍,就可以理解结构体,结构体在ios开发中是灰常重要的一部分,如果您很好的掌握结构体,在后面ios开发中,会理解的更加清楚. 一:结构体声明 格式: struct 结构体名 { } 说明: 1: struct 是定义结构体的关键字 例子 /* 1:struct 是结构体的关键字 2:student 结构体名称 3:student() 创建一

黑马程序员-关于结构体

------- IOS培训.android培训.java培训.期待与您交流! ---------- 1 结构体: 作用:可以由多个不同类型的数据构成. //定义结构体类型,类型为person:(此阶段不会分配存储空间 1 struct person 2 { 3 变量; // 称为结构体变量或属性 4 } 5 //根据结构体类型person,定义结构体变量,变量名为p(此阶段分配存储空间) 6 struct person p={ }; // 赋值的时候只能在定义结构体的时候同时赋值 错误写法 st

C#调用C/C++动态库 封送结构体,结构体数组

因为公司一直都是做C++开发的,因客户需要要提供C#版本接口,研究了一下C#,发现其强大简洁, 在跨语言调用方面封装的很彻底,提供了强大的API与之交互.这点比JNA方便多了. Java与C#都只能调用C格式导出动态库,因为C数据类型比较单一,容易映射. 两者都是在本地端提供一套与之映射的C#/java描述接口,通过底层处理这种映射关系达到调用的目的. 一. 结构体的传递 Cpp代码   #define JNAAPI extern "C" __declspec(dllexport) /

C提高4 多维数组,结构体与二级指针

昨天的试题:原题见昨天作业题 [email protected]:~/high/day03$ cat main.c  /* 二级指针,绝佳训练题1 */ #include <stdio.h> #include <stdlib.h> #include <string.h> int spitspring(char *buf1,char *c,char **myp,int *total) { char *p_head =  buf1; char *p_tail =  buf1