简单的说说golang的struct
这篇文章会讲什么
- 结构体的一些容易被忽略的零散知识点(但是在使用过程中不那么重要)
- 使用结构体的一点小小建议
思维导图
正文
语法糖
无论是定义的普通结构体变量变量,还是结构体指针都是通过点号(.
)访问成员变量.
比如
type Blogger struct {
Name string
Age int32
URL string
}
func main() {
b1 := Blogger{"zhangsan", 18, "zhangsan.com"}
b2 := *&Blogger{"lisi", 19, "lisi.org"}
fmt.Println(b2.Name, b1.Name)
}
b1
和b2
都通过点号访问到成员变量Name,而b2.Name
是等价于(*b2).Name
的.这是一种语法糖的结果,编译器对齐进行了优化.
顺序
在定义结构体的时候,相同类型的成员可以写在同一行,但是一般只在这两个成员紧密相关的时候这样做.
如上面的Blogger
可以写成下面的样子:
type Blogger struct {
Name, URL string
Age int32
}
两个在数据内容上是完全一样的,但是这两个结构体的意义却不同,因此定义成不同名的结构体.
可见性:
结构体的成员在包外的可见性取决于其名字的第一个字母是大写还是小写,如果是大写表示在包外可见,也就是可导出的(类似于其他语言中的public
),如果成员名第一个字母小写则表示在包外不可见,即不可导出的(类似于其他语言的private
)
自我包含:
一个结构体s可以包含数据类型为*s的成员变量,但是不可以包含数据类型为s的成员变量,即便通过嵌套的方式也不可以.
传递:
结构体可以当作参数和返回值传递
修改:
如果需要修改一个结构体一般通过传入结构体的指针,而不是直接返回一个结构体,或者只返回其需要的值.
匿名成员:
- 名字: 匿名成员的名字是其数据类型的名字(如果数据类型是string,那么这个匿名成员的名字就叫string)
- 访问: .+名字(数据类型)
- 同名: 同一个结构体中出现同名成员会冲突,无法通过编译:
ambiguous selector
.同名有两种情况:- 不同匿名成员类型相同(解决办法: 在定义的时候最多只能出现一个某一个类型的匿名成员)
- 嵌套的匿名结构体与结构体其他嵌套匿名成员结构体拥有同名的成员(解决办法: 在访问的时候不省略中间的匿名结构体)