1、关于值传递、引用传递与指针传递
当一个变量或者新值被创建时, 如果没有为其明确指定初始值,go语言会自动初始化其值为此类型对应的零值, 各类型零值如下:
false : bool, 0: integer 0.0: float "": string nil : pointer, function, interface, slice, channel, map
对于复合类型, go语言会自动递归地将每一个元素初始化为其类型对应的零值。比如:数组, 结构体。
nil 是专门为go语言的指针类型和引用类型准备的,go语言的数组和结构体可是值类型, 切片、字典或通道为引用类型。所以如果数组作为函数参数时,因为是值类型, 所以要复制 。
在go语言中没有引用传递,只有值传递。
例1:
func main() { a := []string{"a", "b"} test(a) fmt.Println(a) } func test(b []string) { b = []string{"cc", "cc"} }
打印出来后值为:[a b],表明在传递时是复制了一份单独的数组结构。
指针传递也是值传递。
例2:
指针传递:
func main() { a := &[]string{"a", "b"} test(a) fmt.Println(*a) } func test(b *[]string) { b = nil }
打印出来后为:[a b]。传递指针时,能修改指针所指向的值,并不能修改指针本身的值。
传引用
var a Object modify(a) // 修改a的值 print(a)
如果函数modify
修改a
的值, 然后print
打印出来的也是修改后的值,那么就可以认为modify是通过引用的方式使用了参数a。而如上例子证明了指明传递是值传递。
例3:
func main() { a := new(int) fmt.Println(a) func() { a = nil }() fmt.Println(a) }
打印结果为:
0xc042008220
<nil>
关于指针传递与引用传递参考:https://studygolang.com/articles/4810