package main
import(
"fmt"
)
// int string 参数传递是值传递 非引用类型
// map 参数传递是值传递 引用类型
var a int = 9
var b string = "aa"
var c map[int]int
func modify1(a int) {
fmt.Println("值:",a)
fmt.Println("地址:",&a)
a = 10
fmt.Println("值:", a)
fmt.Println("地址:", &a)
}
func modify2(a string) {
fmt.Println("值:",a)
fmt.Println("地址:",&a)
a = "cccc"
fmt.Println("值:", a)
fmt.Println("地址:", &a)
}
func modify3(a map[int]int) {
fmt.Println("值:",a)
fmt.Printf("地址:%p\n",&a)
a[4] = 10
fmt.Println("值:", a)
fmt.Printf("地址:%p\n",&a)
}
func main(){
fmt.Println("值:", a)
fmt.Println("地址:", &a)
modify1(a)
fmt.Println("值:", a)
fmt.Println("地址:", &a)
fmt.Println("值:", b)
fmt.Println("地址:", &b)
modify2(b)
fmt.Println("值:", b)
fmt.Println("地址:", &b)
c = make(map[int]int)
c[4] = 9
fmt.Println("值:", c)
fmt.Printf("地址:%p\n", &c)
modify3(c)
fmt.Println("值:", c)
fmt.Printf("地址:%p\n", &c)
}
//Go语言中所有的传参都是值传递(传值),都是一个副本,一个拷贝。因为拷贝的内容有时候是非引用类型(int、string、struct等这些),这样就在函数中就无法修改原内容数据;有的是引用类型(指针、map、slice、chan等这些),这样就可以修改原内容数据。是否可以修改原内容数据,和传值、传引用没有必然的关系。在C++中,传引用肯定是可以修改原内容数据的,在Go语言里,虽然只有传值,但是我们也可以修改原内容数据,因为参数是引用类型。这里也要记住,引用类型和传引用是两个概念。再记住,Go里只有传值(值传递)。