指针结构体
-
结构体与数组一样,都是值传递。当把数组或结构体当作实参传给函数的形参时,会赋值一个副本。所以为了提高性能,一般不会直接把数组传递给函数,而是使用切片代替。而把结构体传给函数时,可以使用指针结构体。
如果将结构体转给函数,只是复制结构体的副本,如果在函数内修改结构体字段值(只修改,不返回值),外面的结构体并不会受影响,而如果将结构体指针传给函数,则在函数中使用指针对结构体所做的修改,都会影响到指针指向的结构体。
func main(){ m1 := Member{} m1.name = "aaa" Change1(m1) fmt.Println(m1) m2 := &Member{} Change2(m2) fmt.Println(m2) m3 := Member{} m3 = Change3(m3) fmt.Println(m3) } func Change1(member Member){ member.name = "m1.name" //return member } func Change2(member *Member){ member.name = "m2.name" } func Change3(member Member) Member{ member.name = "m3.name" return member } //结果: {aaa 0} &{m2.name 0} {m3.name 0}
-
指针结构体,即一个指向结构体的指针,声明结构体变量时,在结构体类型前加*号,即声明一个指向结构体的指针。
-
mem := &Member{}
:初始化结构体,结构体指针指向某个结构体地址,然后才能访问字段,为字段赋值。 -
当定义结构体字段名首字母是小写的,意味着这些字段在包外不可见,因而无法在其他包中被访问,只允许包内访问。
type Member struct { id int name string age int }
如果想在一个包中访问另一个包中结构体的字段,则必须是大写字母开头的变量,即可导出的变量,如:
type Member struct { Id int Name string Age int }
【参考文档】
Go Struct超详细讲解