4cccd285f50695ad09fb1c3676f719f6
go实战-函数(高阶、闭包、值传递)

函数可是一等的(first-class)公民,是能够被随意传播的独立逻辑组件。

函数传参

首先, Go语言的函数调用参数全部是传值的, 包括 slice/map/chan 在内所有类型。但是有人反驳,看段代码

package main 
import ( 
    "fmt" 
) 
func main() { 
    slice1 := []string{"zhang", "san"} 
    modify(slice1) 
    fmt.Println(slice1) 
} 
func modify(data []string) { 
    data[1] = "si" 
} 

运行结果:
[zhang si]
这里为什么改变了切片的内容呢?
我们来 打印下 它的地址

package main 
import ( 
    "fmt" 
) 
func main() { 
    slice1 := []string{"zhang", "san"} 
    fmt.Printf("%p\n", &slice1) 
    fmt.Printf("%p\n", &slice1[1]) 
    modify(slice1) 
    fmt.Println(slice1) 
} 
func modify(data []string) { 
    fmt.Printf("%p\n", &data) 
    fmt.Printf("%p\n", &data[1]) 
    data[1] = "si" 
} 

输出:
0xc420090020
0xc420090050
0xc420090060
0xc420090050
[zhang si]

这再次证明了切片传递的不是指针地址,因为变量前后地址不同,也就是说传递的都是值的副本。
这也证明了切片的参数传递的是传值的形式,具体是传值的拷贝,因为指向元素的指针地址相同。

传指针是传引用吗

func main() {
    a := new(int)
    fmt.Println(a)
    modify(a)
    fmt.Println(a)
}
func modify(a *int) {
    a = nil
}

输出:

top Created with Sketch.