You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2.0 KiB
2.0 KiB
golang 中默认是值传递,和java有所区别,需要注意。 在 C 语言中,数组变量是指向第一个元素的指针,但是 Go 语言中并不是。Go 语言中,数组变量属于值类型(value type),因此当一个数组变量被赋值或者传递时,实际上会复制整个数组。 为了避免复制数组,一般会传递指向数组的指针。例如:
func square(arr *[3]int) {
for i, num := range *arr {
(*arr)[i] = num * num
}
}
func TestArrayPointer(t *testing.T) {
a := [...]int{1, 2, 3}
square(&a)
fmt.Println(a) // [1 4 9]
if a[1] != 4 && a[2] != 9 {
t.Fatal("failed")
}
}
值接收者与指针接收者
某个类型定义的方法,其接收者既有值类型,又有指针类型。例如自定义heap实现:
type IntHeap []int
// Push IntHeap全局共享切只有一个,所以需要对类型本身进行操作,所以使用指针
func (h *IntHeap) Push(x any) {
//append需要传入切片,切片是引用传递所以需要*h,
*h = append(*h, x.(int))
}
// Pop
//
// @Description: 从数组移除一个元素
// @receiver h
// @return any
func (h *IntHeap) Pop() any {
old := *h
n := len(old)
x := old[n-1]
*h = old[0 : n-1]
return x
}
// Len
//
// @Description: 计算元素大小
// @receiver h
// @return int
func (h IntHeap) Len() int {
return len(h)
}
// Less
//
// @Description: 比较大小
// @receiver h
// @param i
// @param j
// @return bool
func (h IntHeap) Less(i, j int) bool {
return h[i] < h[j]
}
// Swap
//
// @Description: 交换i,j下标元素
// @receiver h
// @param i
// @param j
func (h IntHeap) Swap(i, j int) {
h[i], h[j] = h[j], h[i]
}
其中Push和Pop方法是指针接收,其他方法是值接收。其中Push和Pop方法需要设置对象本身(例如代码中的数组)因此必须使用指针,避免复制。Swap方法较为特殊,golang默认会交换指针。