Go 中的某些类型是引用类型:映射、切片、通道、函数和方法。有时您需要使用指向引用的指针。例如,type Stack []interface{}func (stack *Stack) Push(x interface{}) { *stack = append(*stack, x)}您需要它,因为所有参数都是通过复制值传递的,并且append()可能需要在切片容量不够大的情况下重新分配内存。我明白了。第一个问题。怎么样map的类型?如果我有一个基于 a 的自定义类型map,如果需要一些 key:value 插入或删除,我应该最好总是传递一个指向它的指针吗?第二个问题。其他引用类型呢?Channel, 例如。我可以想象一种情况,我基于通道构建自定义类型,以对传递给通道的值实现一些自定义预处理。这里也需要指针?对不起,如果这是基本的,但我真的想很好地掌握这个主题。
2 回答
婷婷同学_
TA贡献1844条经验 获得超8个赞
当您将所有事物视为一个值时,规则就相当简单,其中一些值在内部包含指针。
slices:当您可能需要修改长度或容量时使用指针,这会更改切片的值。
maps:不要使用指针,因为地图值不会随着修改而改变。
函数和方法:不要使用指针,通过函数值也有同样的效果。
陈:不要使用指针。
当然也有例外,例如如果您希望能够完全换出地图,则需要使用指针来实现,但这些情况很少见。
一只斗牛犬
TA贡献1784条经验 获得超2个赞
“值类型”和“引用类型”之间并没有真正的二分法。“引用类型”仅用于描述其“值”完全由单个指针组成的值类型。
这适用于映射和通道类型,它们基本上是指向内部结构的指针类型。但这对切片来说并不完全正确,因为切片是一种复合类型(基本上是一个结构),由两个整数值(长度和容量)和一个指针(指向元素)组成。因此,对于通过指针访问的元素而言,它是一种“引用类型”,但对于长度和容量而言,它是一种“值类型”。
追加到切片操作的是它的长度和潜在的容量,因此它需要更改切片的“值”,而原地分配元素只使用指针,因此不需要更改切片的“值” . 如果您希望将指针更改为指向与另一个切片相同的指针(您可以通过分配给切片来实现),您可能还需要更改切片的“值”。
它与“参考类型”、地图和通道类似。更改地图或通道的“内容”(在指针指向的内容中)不需要更改地图或通道的“值”。但是,如果您想更改指针以指向不同的底层映射或通道,那么您将更改映射或通道变量的“值”。
- 2 回答
- 0 关注
- 177 浏览
添加回答
举报
0/150
提交
取消