Go:引用类型作为参数
Go: reference types as arguments
Go 中的某些类型是引用类型:映射、切片、通道、函数和方法。
有时您需要使用指向引用的指针。例如,
type Stack []interface{}
func (stack *Stack) Push(x interface{}) {
*stack = append(*stack, x)
}
你需要它,因为所有参数都是通过复制值传递的,并且 append()
可能需要在切片容量不够大时重新分配内存。我明白了。
第一个问题。 map
类型怎么样?如果我有一个基于 map
的自定义类型,如果需要一些 key:value 插入或删除,我是否应该 总是 传递指向它的指针更好?
第二个问题。其他引用类型呢? Channel
,例如。我可以想象这样一种情况,我基于通道构建自定义类型,以对传递到通道的值实施一些自定义预处理。这里也需要指点?
对不起,如果这是基本的,但我真的想很好地掌握这个主题。
当您将一切都视为一个值时,规则就相当简单了,其中一些值在内部包含指针。
- slices:当您可能需要修改长度或容量时使用指针,这会改变切片的值。
- maps: 不要使用指针,因为地图值不会随着修改而改变。
- 函数和方法: 不要使用指针,通过函数值也有同样的效果。
- chan: 不要使用指针。
当然也有例外,比如如果你想完全换出一张地图,你需要使用指针来这样做,但这种情况很少见。
"value types" 和 "reference types" 之间并没有真正的二分法。 "Reference type" 仅用于描述其 "value" 完全由单个指针组成的值类型。
地图和通道类型也是如此,它们基本上是指向内部结构的指针类型。但这对于切片来说并不完全正确,因为切片是一种复合类型(基本上是一个结构),由两个整数值(长度和容量)和一个指针(指向元素)组成。因此,对于通过指针访问的元素,它是 "reference type",但对于长度和容量,它是 "value type"。
附加到一个切片操作它的长度和潜在的容量,所以它需要改变切片的 "value",而分配给元素就地只使用指针,因此不需要改变切片的 "value"。如果您希望将指针更改为指向与另一个切片相同的指针(您可以通过分配给切片来完成),您可能还需要更改切片的 "value"。
"reference types"、地图和频道类似。更改地图或频道的 "contents"(在指针指向的内容中)不需要更改地图或频道的 "value"。但是,如果您想更改指针以指向不同的底层地图或通道,那么您将更改地图或通道变量的 "value"。
Go 中的某些类型是引用类型:映射、切片、通道、函数和方法。
有时您需要使用指向引用的指针。例如,
type Stack []interface{}
func (stack *Stack) Push(x interface{}) {
*stack = append(*stack, x)
}
你需要它,因为所有参数都是通过复制值传递的,并且 append()
可能需要在切片容量不够大时重新分配内存。我明白了。
第一个问题。 map
类型怎么样?如果我有一个基于 map
的自定义类型,如果需要一些 key:value 插入或删除,我是否应该 总是 传递指向它的指针更好?
第二个问题。其他引用类型呢? Channel
,例如。我可以想象这样一种情况,我基于通道构建自定义类型,以对传递到通道的值实施一些自定义预处理。这里也需要指点?
对不起,如果这是基本的,但我真的想很好地掌握这个主题。
当您将一切都视为一个值时,规则就相当简单了,其中一些值在内部包含指针。
- slices:当您可能需要修改长度或容量时使用指针,这会改变切片的值。
- maps: 不要使用指针,因为地图值不会随着修改而改变。
- 函数和方法: 不要使用指针,通过函数值也有同样的效果。
- chan: 不要使用指针。
当然也有例外,比如如果你想完全换出一张地图,你需要使用指针来这样做,但这种情况很少见。
"value types" 和 "reference types" 之间并没有真正的二分法。 "Reference type" 仅用于描述其 "value" 完全由单个指针组成的值类型。
地图和通道类型也是如此,它们基本上是指向内部结构的指针类型。但这对于切片来说并不完全正确,因为切片是一种复合类型(基本上是一个结构),由两个整数值(长度和容量)和一个指针(指向元素)组成。因此,对于通过指针访问的元素,它是 "reference type",但对于长度和容量,它是 "value type"。
附加到一个切片操作它的长度和潜在的容量,所以它需要改变切片的 "value",而分配给元素就地只使用指针,因此不需要改变切片的 "value"。如果您希望将指针更改为指向与另一个切片相同的指针(您可以通过分配给切片来完成),您可能还需要更改切片的 "value"。
"reference types"、地图和频道类似。更改地图或频道的 "contents"(在指针指向的内容中)不需要更改地图或频道的 "value"。但是,如果您想更改指针以指向不同的底层地图或通道,那么您将更改地图或通道变量的 "value"。