Go:引用类型作为参数

Go 中的某些类型是引用类型:映射、切片、通道、函数和方法。


有时您需要使用指向引用的指针。例如,


type Stack []interface{}

func (stack *Stack) Push(x interface{}) { 

    *stack = append(*stack, x)

}

您需要它,因为所有参数都是通过复制值传递的,并且append()可能需要在切片容量不够大的情况下重新分配内存。我明白了。


第一个问题。怎么样map的类型?如果我有一个基于 a 的自定义类型map,如果需要一些 key:value 插入或删除,我应该最好总是传递一个指向它的指针吗?


第二个问题。其他引用类型呢?Channel, 例如。我可以想象一种情况,我基于通道构建自定义类型,以对传递给通道的值实现一些自定义预处理。这里也需要指针?


对不起,如果这是基本的,但我真的想很好地掌握这个主题。


料青山看我应如是
浏览 178回答 2
2回答

婷婷同学_

当您将所有事物视为一个值时,规则就相当简单,其中一些值在内部包含指针。slices:当您可能需要修改长度或容量时使用指针,这会更改切片的值。maps:不要使用指针,因为地图值不会随着修改而改变。函数和方法:不要使用指针,通过函数值也有同样的效果。陈:不要使用指针。当然也有例外,例如如果您希望能够完全换出地图,则需要使用指针来实现,但这些情况很少见。

一只斗牛犬

“值类型”和“引用类型”之间并没有真正的二分法。“引用类型”仅用于描述其“值”完全由单个指针组成的值类型。这适用于映射和通道类型,它们基本上是指向内部结构的指针类型。但这对切片来说并不完全正确,因为切片是一种复合类型(基本上是一个结构),由两个整数值(长度和容量)和一个指针(指向元素)组成。因此,对于通过指针访问的元素而言,它是一种“引用类型”,但对于长度和容量而言,它是一种“值类型”。追加到切片操作的是它的长度和潜在的容量,因此它需要更改切片的“值”,而原地分配元素只使用指针,因此不需要更改切片的“值” . 如果您希望将指针更改为指向与另一个切片相同的指针(您可以通过分配给切片来实现),您可能还需要更改切片的“值”。它与“参考类型”、地图和通道类似。更改地图或通道的“内容”(在指针指向的内容中)不需要更改地图或通道的“值”。但是,如果您想更改指针以指向不同的底层映射或通道,那么您将更改映射或通道变量的“值”。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go