1.类型定义和类型别名
//类型定义 定义了自己 可以给自定义类型添加方法 type NewInt int func (i *NewInt) getInt() int { return 100 } //类型别名 就是个int类型 换了个名字 叫MyInt类型 type MyInt = int func main() { var newInt NewInt var myInt MyInt myInt = newInt.getInt() fmt.Printf("type of myInt:%T,myInt.value:%d\n", myInt, myInt) //type of myInt:int,myInt.value:100 newInt = 200 fmt.Printf("type of newInt:%T,newInt.value:%d ,newInt.getInt():%d\n", newInt, newInt, newInt.getInt()) //type of newInt:main.NewInt,newInt.value:200 ,newInt.getInt():100 }
2.结构体初始化
p := &person{} 相当于对该结构体类型进行了一次new实例化操作
使用New或者& 创建的结构体 返回的是该结构体实例的指针。
在go语言中支持对指针使用“.”来直接访问结构体成员
p.xx 其实在底层是(*p).xx,这是go的语法糖
p := &person{}
像这样初始化不赋值的 ,里面的成员默认初始值为零值 int为0 string为空“” 指针类型为nil
初始化赋值要么全部赋值,要么全部不赋值
3.方法和接受者
func (接收者变量 接收者类型) 方法名(参数列表) (返回参数) {
函数体
}
接收者类型可以为值类型或者指针类型
当接收者为指针时,对接收者成员修改值,在方法结束后是有效的。
当接收者为值时,对接收者成员的值修改,方法结束后不生效,因为go会在代码运行时将接收者的值复制一份。
应当使用指针:
1.需要修改接收者中的值
2.接收者是拷贝代价比较大的大对象
3.保证一致性,如果有某个方法使用了指针接收者,那么其他的方法也应该使用指针接收者。
https://www.topgoer.com/go%E5%9F%BA%E7%A1%80/%E7%BB%93%E6%9E%84%E4%BD%93.html