go的一些坑。。。

1. 函数A把切片作为参数传入函数B

由于切片的底层是结构体,这种传参表面是切片引用,本质却是结构体的值传递,因此如果B内部对切片进行重新赋值或扩容,会导致B中切片的底层数组指针变化,而A中的切片还是原来的底层数组。

2. map的value存放结构体

map的value可以直接存放结构体,但是不能用map[key].field = 1这种方式更新字段值。

因为 go中的 map 的 value 本身是不可寻址的, map 的扩容的时候,可能要做键值对迁移。

解决办法:value存放结构体指针;或者重新赋值整个结构体。

3. goroutine导致的内存泄露

协程永远阻塞在chan的读写上无法退出。

可以通过context.Done配合cancel解决

4. 全局变量使用不恰当导致内存浪费

本该被回收的对象无意间被全局变量引用,内存空间得不到释放。

5. 指针类型实现接口

以值类型接收者实现接口,类型本身和类型指针都实现了该接口;

但是以指针类型接收者实现接口,对应的值类型并没有实现该接口。

因此,如下会报panic。

type interf1 interface{

  function1( )

}

func (p *P)function1( ){

}

var p1 P = ...

p1.function1( )

// 正确写法应该是 (&p1).function1( )

 

posted @ 2022-10-23 15:13  Saturn5  阅读(44)  评论(0)    收藏  举报