1、赋值操作
// 案例1var x = 10fmt.Printf("x的地址%p\n", &x)y := xfmt.Printf("y的地址%p\n", &y)x = 100fmt.Println(y)// 案例2var a = []int{1, 2, 3}b := aa[0] = 100fmt.Println(b)// 案例3var m1 = map[string]string{"name":"yuan"}var m2 = m1m2["age"] = "22"fmt.Println(m1)
2、函数传参
package mainimport "fmt"func func01(x int) {x = 100}func func02(s []int) {fmt.Printf("func02的s的地址:%p\n",&s)s[0] = 100// s = append(s, 1000)}func func03(p *int) {*p = 100}func main() {// 案例1var x = 10func01(x)fmt.Println(x)// 案例2var s = []int{1, 2, 3}fmt.Printf("main的s的地址:%p\n",&s)func02(s)fmt.Println(s)//案例3var a = 10var p *int = &afunc03(p)fmt.Println(a)}
Go语言中所有的传参都是值传递(传值),都是一个副本,一个拷贝。因为拷贝的内容有时候是非引用类型(int、string、struct等这些),这样就在函数中就无法修改原内容数据;有的是引用类型(指针、map、slice、chan等这些),这样就可以修改原内容数据。
func makemap(t *maptype, hint int64, h *hmap, bucket unsafe.Pointer) *hmap {}
make函数创建的map就是一个指针类型,工作原理类似于案例3,所以map数据和切片数据一样虽然值拷贝但依然可以修改原值。
