基本介绍
1.从概念或叫法放上看:结构体的字段=属性=field
2.字段是结构体的一个组成部分,一般是基本数据类型、数组,也可以是引用类型
3.在创建一个结构体变量后,如果没有给字段赋值,都对应一个默认值,具体值与字段类型相关。如果是切片或者map之类的类型,则需要make后才可以使用该字段,因为只是声明了字段,并没有分配内存空间
4.不同结构体变量的字段是独立的,互不影响,一个结构体变量字段的更改不会影响另外的结构体
5.结构体默认是值类型,使用时会默认进行值拷贝,比如赋值给另一个结构体或者进行函数传递的时候,如果想要同步改变,则可以进行指针传递
结构体的基本语法
var person struct{
name string
age int
}
结构体的声明,推荐使用第一种或者第二种
方式一
var person Person
person.name = "张三"
person.age = 18
方式二
var person Person = Person{}
person.name = "张三"
person.age = 18
方式三,结构体指针
var person *Person = new(Person)
person.name = "张三"
person.age = 18
方式四,结构体指针
var person *Person = &Person{}
person.name = "张三"
person.age = 18
方式五
person := Person{}
给结构体定义方法,自定义的类型都可以有方法
方法的声明和调用
上图中的test()就是Person的方法,
如方法内部不需要使用该该结构体,可以省略p
func (Person) test(){
fmt.Print("person.name",p.name)
}
方法的注意事项
1.结构体类型是值类型,在方法调用中,遵守值类型的传递机制,是值拷贝传递方式
2.如希望在方法中修改结构体变量的值,可以通过结构体指针的方式来处理,如func (p *Person) test()
3.golang中的方法作用在指定的数据类型是行,因此自定义类型都可以有方法,而不仅仅是struct,比如int,float32等。
4.方法的访问范围控制的规则和函数一样,方法名手写字母小写,只能在本包访问,方法首字母大写,可以在本包和其他包访问
5.如果一个变量实现了String()这个方法,那么fmt.Println默认会调用这个变量的String()进行输出