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.
|
|
|
|
golang 中默认是值传递,和java有所区别,需要注意。
|
|
|
|
|
在 C 语言中,数组变量是指向第一个元素的指针,但是 Go 语言中并不是。Go 语言中,数组变量属于值类型(value type),因此当一个数组变量被赋值或者传递时,实际上会复制整个数组。
|
|
|
|
|
为了避免复制数组,一般会传递指向数组的指针。例如:
|
|
|
|
|
```golang
|
|
|
|
|
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实现:
|
|
|
|
|
```golang
|
|
|
|
|
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默认会交换指针。
|