初学go,踩的一些坑
可能里面也会有一些问题,欢迎一起讨论
感觉没必要记笔记软件里,毕竟后续熟练就好了,索性丢在这里,单纯记录一下
make方法 : 作用是分配内存地址,(一直很疑惑,什么时候才需要使用到它...)
. 当我们通过var 定义一些引用类型的变量时(如 map、指针、切片),定义后该变量的初始值为nil,这个时候该变量是没有确定的内存地址的
. 后续我们直接操作该变量参数值的时候,就会报错 类似assignment to entry in nil map 或 invalid memory address or nil pointer dereference错误比较多
因为牵扯到内存和指针,所以编译的时候没问题,一运行就报错
. 所以var之后,我们就需要通过make,给该变量分配内存地址,
. 在项目代码中,目前也看到很多人 直接用 := 来定义变量,可以省略var和make的步骤,看各自的代码习惯吧
注意点
. 切片的append方法。在var定义后,即使不使用make,也能用append操作切片数据,因为append在底层就会给切片分配内存地址
作用域
1. 这是我自己碰到的一个问题...
. 当我们需要在代码中定义一个全局变量a,并会在某些函数中使用到变量a的时候,慎用 := !!!
. 在函数中使用 a:=... 会定义一个函数局部变量,和全局变量a是两码事,= 是赋值 := 是定义 不要搞混了
稍微复杂的变量
. OclSubhook和OclSubhookSetting都是自定义结构体类型
//先看OclSubhooks{}, 初始化OclSubhooks类型值
//再看&OclSubhooks{} 。 取OclSubhooks类型值的内存地址
AccountSubhooksStruct := &OclSubhooks{}
//先看*OclSubhookSetting, 这是OclSubhookSetting的指针类型
//再看[]*OclSubhookSetting, 这是OclSubhookSetting指针类型的切片
//最后[]*OclSubhookSetting{} 这是OclSubhookSetting指针类型的切片的初始化值
SubhookSettingItem := []*OclSubhookSetting{}
注意 *的用法 老是搞混
1. *放在类型前面,代表这种类型的 内存地址
2. *放在变量(特指指针变量)前面,代表指针变量所指向的内存地址中的值
var a int = 10 定义一个数值类型的变量为10
var p *int 定义一个变量p 类型为指针
p = &a 给p赋值,a是变量不是内存地址,所以要在a前面加个&,代表指向了a的内存地址
*p = 20 *p代表p这个指针所指向的内存地址中的值,重新赋值,等效于 a=20