go系列之值传递、引用传递与指针传递

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

猜你喜欢

转载自www.cnblogs.com/mazhimazhi/p/9019420.html