Skip to main content

go的指针和引用

数组

首先,数组是基础类型,不是引用类型。传递数组为参数,只是传递了一个数组的副本。

var array = [3]int{1, 2, 3}

func test(list [3]int) [3]int {
list[1] = 10
return list
}

fmt.Print(test(array)) // [1 10 3]
fmt.Print(array) // [1 2 3]

所以,函数修改数组就要通过指针来操作。

go语言的指针和C++比较类似:

类型 *T 是指向 T 类型值的指针。其零值为 nil

&R获取变量R的内存地址。变量->内存地址

*p获取指针指向的值。内存地址->变量

var array = [3]int{1, 2, 3}
var array_pointer *[3]int = &array

func test(list *[3]int) [3]int {
list[1] = 10
return *list
}

fmt.Print(test(array_pointer)) // [1 10 3]
fmt.Print(array_pointer) // [1 10 3]

切片

切片是一个引用类型,所以go会自动转换并且屏蔽细节。

var slice = []int{1, 2, 3}

func test(slice []int) []int {
slice[1] = 10
return slice
}

fmt.Print(test(slice)) // [1 10 3]
fmt.Print(slice) // [1 10 3]

不需要用指针来引用传递。

结构体

type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}

func invertTree(root *TreeNode) *TreeNode {
root.Left, root.Right = root.Right, root.Left
invertTree(root.Left)
invertTree(root.Right)
return root
}

但是结构体还是得用指针,因为它不是引用类型。