Go 通过类型别名(alias types)和结构体的形式支持用户自定义类型,或者叫定制类型。一个带属性的结构体试图表示一个现实世界中的实体。结构体是复合类型(composite types),当需要定义一个类型,它由一系列属性组成,每个属性都有自己的类型和值的时候,就应该使用结构体,它把数据聚集在一起。然后可以访问这些数据,就好像它是一个独立实体的一部分。结构体也是值类型,因此可以通过 new 函数来创建。
结构体定义
结构体定义一般如下
结构体类型 结构体名字 struct {
字段 字段数据类型
}
结构体的字段可以是任何类型,甚至是结构体本身,也可以是函数或者接口。
也可以用以下方法
var t T //t变量名 T变量数据类型
t.a = 1
t.b = 8
var t *T //t指向T指针
t = new(T)
方法
在Go语言中,结构体就像是类的一种简化形式。Go 方法是作用在接收者(receiver)上的一个函数,接收者是某种类型的变量。因此方法是一种特殊类型的函数。
接收者类型可以是(几乎)任何类型,不仅仅是结构体类型:任何类型都可以有方法,甚至可以是函数类型,可以是 int、bool、string 或数组的别名类型。但是接收者不能是一个接口类型。
定义方法的格式一般如下
func (recv receiver_type) methodName(parameter_list)
(return_value_list) { ... }
在方法名之前,func 关键字之后的括号中指定 receiver。
如果 recv 是 receiver 的实例,Method1 是它的方法名,那么方法调用遵循传统的 object.name 选择器符号:recv.Method1()。
如果 recv 一个指针,Go 会自动解引用。
如果方法不需要使用 recv 的值,可以用 _ 替换它,例如
func (_ receiver_type) methodName(parameter_list)
(return_value_list) { ... }
函数和方法的区别
函数将变量作为参数:Function1(recv)
方法在变量上被调用:recv.Method1()
在接收者是指针时,方法可以改变接收者的值(或状态),这点函数也可以做到(当参数作为指针传递,即通过引用调用时,函数也可以改变参数的状态) 方法没有和数据定义(结构体)混在一起:它们是正交的类型;表示(数据)和行为(方法)是独立的。