ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
* 在函数间传递变量时,总是以值的方式进行传递的. * 在函数中传递数组的时候最好以指针的方式进行传递.会减少很多开销. * if 能写在一行,别写多行,避免变量污染. if xxx,err := yyy; err != nil {} 这种. * go语言只有值传递一种方式,那么怎么实现引用传递呢 ? 使用指针 . * 既然golang里面只有值传递,为什么很多参数看起来是值传递,实际上是引用传递呢 ? 因为在这些结构体中对其他结构体的地址进行了引用.等于是进行了一次封装. 如下图 . ![](https://box.kancloud.cn/36503bf103ceb98aa8d61cd717e94069_2858x1634.png) * slice是引用类型,slice里面是有一个数据结构的,slice是对array的view. ![](https://box.kancloud.cn/a1fc4e6dc41d2dd2ed87e59988621f70_1528x807.png) ![](https://box.kancloud.cn/859a781770d6705f22c214e6a745fd94_1436x688.png) * map申明后必须初始化才能使用,var m map[string]string仅仅是对map进行申明,还需要m = makemap[string]string)来初始化才可以使用. 建议直接使用m := make(map[string]string)的方式来创建map. * map的key必须可以进行比较相等,在golang中除了slice,map,function 的内建类型都可以作为key. struct 不包含上述类型也可以作为key . * 在结构体内不论pointer 还是value一律使用 "." 来访问 * 要改变内容需要使用指针接收者. 结构过大也可以考虑指针接收者. * 一致性: 如果有指针接收者,最好都是指针接收者 . * 值接收者才是golang特有. * 不能在不能寻址的T类型上调用指针方法,如下.直接调用M1方法会报错,因为它的接受者是指针,而此时还没有变量保存T1类型,所以就不存在内存地址. * ~~~ type T1 struct { } func (t *T1) M1() { fmt.Println("hello") } func (t T1) M2() { fmt.Println("world") } func main() { T1{}.M1() } ~~~