wtysos11 / blogWiki

Use to store public paper and organize them.
18 stars 4 forks source link

golang slices的指针传递 #215

Closed wtysos11 closed 3 years ago

wtysos11 commented 3 years ago

今天遇到了一个问题,需要给一个结构体中的interface{}传递slice,在纠结要不要传指针

为什么传指针呢?主要是两点:

  1. 如果不传指针给interface的话,在赋值的时候会触发额外的转换(因为slice是一个结构体,包含了很多属性)。可以参考interface一文,对于interface{}类型,其实现是简化过的eface,而普通的接口则是iface,因此如果将一个超过机器字长的对象(现在一般是64位)的对象赋值给interface{}的时候,会触发额外的内存分配操作,调用runTime.convTslice。这个代价是比较高的,因此尽量要进行避免
  2. slice如果只是传值的话len和cap会只进行复制传递。不过这个跟我的需求没有关系,只是很多函数传值的时候会传slice指针,所以顺带一提。具体可以参考Golang tips: why pointers to slices are useful and how ignoring them can lead to tricky bugs