对码当歌,猿生几何?

GO值复制

GO语言本身是值传递,先给结论,再看case.


  1. 标量类型是赋值是值传递,如int float string

  2. 数组和结构体赋值也是值传递,如[2]string  struct{}

  3. 指针赋值也是值传递,只不过传递的是地址而已

  4. map和slice赋值是引用传递,如map[string][string] []string

  5. 字符串遍历,得到值是字符,索引是不连续的。如下


  • 标量类型

func TestInt(t *testing.T) {
   num1 := 123
   num2 := num1
   num1 = 456
   fmt.Println("num1", num1)   // num1 456
   fmt.Println("num2", num2)   // num2 123
}

func TestString(t *testing.T) {
   str1 := "ccb"
   str2 := str1
   str1 = "ccb1"
   fmt.Println("str1", str1)   // str1 ccb1
   fmt.Println("str2", str2)   // str2 ccb
}


  • 数组

func TestArray(t *testing.T) {
   arr1 := [2]string{"ccb", "123"}
   arr2 := arr1
   arr1[0] = "ccb1"
   arr2[1] = "1234"
   fmt.Println("arr1", arr1)  // arr1 [ccb1 123]
   fmt.Println("arr2", arr2)  // arr2 [ccb 1234]
}


  • 结构体

func TestStruct(t *testing.T) {
   type P struct {
      Name string
      Pass string
      Maps map[string]string
   }
   p1 := P{
      Name: "ccb",
      Pass: "123",
      Maps: map[string]string{
         "key": "val",
      },
   }
   p2 := p1
   p1.Name = "ccb1"
   p2.Maps["key"] = "val1"
   p2.Pass = "1234"
   fmt.Println("p1", p1)     // p1 {ccb1 123 map[key:val1]}
   fmt.Println("p2", p2)     // p2 {ccb 1234 map[key:val1]}
}


  • Map

func TestMap(t *testing.T) {
   map1 := make(map[string]string, 2)
   map1["name"] = "ccb"
   map1["pass"] = "123"
   map2 := map1
   map1["name"] = "ccb1"
   map2["pass"] = "1234"
   fmt.Println("map1", map1)  // map1 map[name:ccb1 pass:1234]
   fmt.Println("map2", map2)  // map2 map[name:ccb1 pass:1234]

}


  • 数组遍历

func TestString(t *testing.T) {
   str := "abc中文"
   fmt.Println("len(str)=", len(str))
   for i, c := range str {
      fmt.Printf("%v : %v\n", i, string(c))
   }
}

输出

len(str)= 9
0 : a
1 : b
2 : c
3 : 中
6 : 文