go结构体随笔

发布时间 2023-03-22 21:16:24作者: 来杯王老吉

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