go学习笔记
1.在go语言中,变量没有初始化,则根据当前类型默认为对应的“零”;
例如:int -> 0, bool -> false, string-> "",其他派生类型为 nil
2.println和fmt.Println的区别:
println有built-in包提供,主要用来打印错误,且没有返回值,主要用来debug
fmt.Println是标准库提供的标准输出,第一个数为输出使用了多少字节,第二个为错误信息上
。。。谁能想到输出你好怎么搞出7个字节的
3.unsafe.Sizeof(tmp),返回tmp的占用的内存大小,
注意点:string类型总是返回16,原因是因为string对应的是一个结构体,包含两个字段,一个是指向值的指针,一个是长度,所以两个字段一共占用了16字节。
4.结构体的指针
在学习int指针的时候了解到应该用*号从地址中取值,但是到结构体指针时看到不用*号也能直接获取值,这一点有点费解。
从图中可以看到,对于结构体指针来说,加不加*号都是一样的效果。
原因:借用go语言中文网一位大佬的翻译:
想详细了解的,推荐链接
5.数组和切片的区别
1.数组长度是固定的,切片长度可以调整
2.数组是值类型,意思是只要你类型,长度,数值相等,两个数组就相等,而切片除了和nil比较外不能和其他切片比较。
3.由数组转换而来的切片是原数组的一种展示,即修改切片中的值原数组也会相应改变。
注意:
在函数的参数传递中,由于数组是值类型,所以传递的是值的拷贝,即对参数进行操作不会影响原数组。而切片当参数传递时可以直接改变原切片。数组传递地址可以达到和切片一样的效果。
切片会保留对原数组的引用,所以只要切片还在,数组占用的内存不会被回收,所以只需要使用数组部分的时候建议使用copy函数,创建一个切片的拷贝,原数组也能被回收。