目录
1.结构体、方法、接口
1.1.结构体
Go 语言中没有“类”的概念,也不支持像继承这种面向对象的概念。但是Go 语言的结构体与“类”都是复合结构体,而且Go 语言中结构体的组合方式比面向对象具有更高的扩展性和灵活性。
1.1.1 结构体定义
结构体一般定义如下:
type identifier struct {
field1 type1
field2 type2
...
}
例如我们想声明一个学生的结构体类型:
type Student struct {
Name string
Age int
}
结构体中字段的类型可以是任何类型,包括函数类型,接口类型,甚至结构体类型本身。例如我们声明一个链表中的节点的结构体类型。
type ListNode struct {
Val int
Next *ListNode
}
在声明结构体时我们也可以不给字段指定名字,例如下面这样
type Person struct {
ID string
int
}
我们可以看到其中有一个int字段没有名字,这种我们称其为匿名字段。
1.1.2 操作结构体
声明完结构体之后我们需要创建结构体的实例,可以使用如下几种方法创建,仍然以上面的Student结构体为例。
s1 := new(Student) //第一种方式
s2 := Student{
"james", 35} //第二种方式
s3 := &Student {
//第三种方式
Name: "LeBron",
Age: 36,
}
- 使用new函数会创建一个指向结构体类型的指针,创建过程中会自动为结构体分配内存,结构体中每个变量被赋予对应的零值。
- 也可以使用第二种方式生命结构类型,需要注意的是此时给结构体赋值的顺序需要与结构体字段声明的顺序一致。
- 第三种方式更为常用,我们创建结构体的同时显示的为结构体中每个字段进行赋值。
声明完结构体之后可以直接按如下方式操作结构体。
s1.Name = "james"
s1.Age = 35
需要注意的是,结构体也仍然遵循可见性规则,要是定义结构体的字段时首字母为小写在其他包是不能直接访问该字段的。
如果我们将定义的结构体首字母也变为小写那么在其他包内就不能直接创建该结构体,你知道这种情况应该怎么处理么?
上面我们提到的匿名字段,可以使用如下方法对其进行操作。
p := new(Person)
p.ID = "123"
p.int = 10
我们直接通过p.int的方式来访问结构体中的匿名字段对其赋值,通过这个例子也可以发现,对于一个结构体来说,每一种数据类型只能有一个匿名字段。
1.1.3 标签
在go语言中结构体除了字段的名称和类型外还有一个可选的标签tag,标记的tag只有reflect包可以访问到,一般用于orm或者json的数据传递,下面这段代码演示了如何为结构体打标签。
也就是给变量起别名, 方便输出/其他作用
type Student struct {
Name string `json:"name"`
Age int `json:"age"`
}