1、赋值操作

  1. // 案例1
  2. var x = 10
  3. fmt.Printf("x的地址%p\n", &x)
  4. y := x
  5. fmt.Printf("y的地址%p\n", &y)
  6. x = 100
  7. fmt.Println(y)
  8. // 案例2
  9. var a = []int{1, 2, 3}
  10. b := a
  11. a[0] = 100
  12. fmt.Println(b)
  13. // 案例3
  14. var m1 = map[string]string{"name":"yuan"}
  15. var m2 = m1
  16. m2["age"] = "22"
  17. fmt.Println(m1)

2、函数传参

  1. package main
  2. import "fmt"
  3. func func01(x int) {
  4. x = 100
  5. }
  6. func func02(s []int) {
  7. fmt.Printf("func02的s的地址:%p\n",&s)
  8. s[0] = 100
  9. // s = append(s, 1000)
  10. }
  11. func func03(p *int) {
  12. *p = 100
  13. }
  14. func main() {
  15. // 案例1
  16. var x = 10
  17. func01(x)
  18. fmt.Println(x)
  19. // 案例2
  20. var s = []int{1, 2, 3}
  21. fmt.Printf("main的s的地址:%p\n",&s)
  22. func02(s)
  23. fmt.Println(s)
  24. //案例3
  25. var a = 10
  26. var p *int = &a
  27. func03(p)
  28. fmt.Println(a)
  29. }

Go语言中所有的传参都是值传递(传值),都是一个副本,一个拷贝。因为拷贝的内容有时候是非引用类型(int、string、struct等这些),这样就在函数中就无法修改原内容数据;有的是引用类型(指针、map、slice、chan等这些),这样就可以修改原内容数据。

  1. func makemap(t *maptype, hint int64, h *hmap, bucket unsafe.Pointer) *hmap {
  2. }

make函数创建的map就是一个指针类型,工作原理类似于案例3,所以map数据和切片数据一样虽然值拷贝但依然可以修改原值。