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
}
但是结构体还是得用指针,因为它不是引用类型。