为了账号安全,请及时绑定邮箱和手机立即绑定

Go:引用类型作为参数

Go:引用类型作为参数

Go
料青山看我应如是 2021-10-18 16:22:59
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:不要使用指针,因为地图值不会随着修改而改变。

  • 函数和方法:不要使用指针,通过函数值也有同样的效果。

  • :不要使用指针。

当然也有例外,例如如果您希望能够完全换出地图,则需要使用指针来实现,但这些情况很少见。


查看完整回答
反对 回复 2021-10-18
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

“值类型”和“引用类型”之间并没有真正的二分法。“引用类型”仅用于描述其“值”完全由单个指针组成的值类型。

这适用于映射和通道类型,它们基本上是指向内部结构的指针类型。但这对切片来说并不完全正确,因为切片是一种复合类型(基本上是一个结构),由两个整数值(长度和容量)和一个指针(指向元素)组成。因此,对于通过指针访问的元素而言,它是一种“引用类型”,但对于长度和容量而言,它是一种“值类型”。

追加到切片操作的是它的长度和潜在的容量,因此它需要更改切片的“值”,而原地分配元素只使用指针,因此不需要更改切片的“值” . 如果您希望将指针更改为指向与另一个切片相同的指针(您可以通过分配给切片来实现),您可能还需要更改切片的“值”。

它与“参考类型”、地图和通道类似。更改地图或通道的“内容”(在指针指向的内容中)不需要更改地图或通道的“值”。但是,如果您想更改指针以指向不同的底层映射或通道,那么您将更改映射或通道变量的“值”。


查看完整回答
反对 回复 2021-10-18
  • 2 回答
  • 0 关注
  • 177 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信