基础
1 .结构体成员变量的顺序对于结构体的一致性非常重要,顺序变化就相当于定义了新的结构体
2 .一个结构体可以同时包含可导出变量以及不可导出变量
3 .如果结构体的全部成员都是可以比较的,那么结构体也是可以比较的,两个结构体可以进行==或者!=进行比较
4 .访问的时候使用 .
5 .嵌入式结构体
6 .使用简短变量赋值时最常见的结构体创建方式
方法
1 .方法的接收者可以式任意类型,不仅仅式结构体,比如函数类型,int,bool,string这些基本类型都可以
2 .一个给定的类型和一个给定的名称,只会有一个方法。不能重载
3 .但是根据方法接收者的不同类型,会出现重载这种情况,拥有相同名字的一个方法可以有两个或者多个不同的接收者类型。
//想要给一个基础类型添加方法:需要type临时定义一个。
type Any int
func(in Any)log(){
fmt.Println(in)
}
func main(){
var a Any=10
a.log()
}
4 .接收者是指针的话,方法里面的修改是会影响到原来结构体的
5 .Go语言中接收者和方法必须在一个包内,不然不能定义方法
6 .接收者不能是接口
7 .接收者不能是指针类型
type Any *int
func(in Any)log(){
fmt.Println(in)
}
4 .方法和封装
1 .无法通过对象直接访问其成员的变量和方法,就称这些成员变量和方法是被封装的
2 .封装是通过对访问权限来控制的
3 .想要暴露出来的变量和方法就大写,不想暴露的就小写
4 .改变变量只能通过set,get方法
5 .嵌套结构体的时候,后面的结构体会继承上之前结构体的方法,如果遇到同名方法,时候覆盖继承的方法
6 .自定义结构体字段的默认值
1 .布尔值 false
2 .int 0
3 .float 0.0
4 .string " "
5 .pointer nil
6 .Function nil
7 .Interface nil
8 .slice nil
9 .channel nil
10 .map nil
7 .自定义默认值的方法
8 .如果要修改原来的结构体实例,就使用指针。如果不需要修改原始结构体实例,就使用值。
9 .打印结构体
a:=Animal{
"Dog",12,
}
fmt.Printf("name:%s","三国")
fmt.Printf("%s\n",a)
fmt.Println(a)
fmt.Printf("%v\n",a)
fmt.Printf("%+v",a)