go的值类型和引用类型------重要的概念

       在本文中, 我们来简要说一下go的值类型和引用类型, 这很重要。

       在go中,

       值类型有:    int float bool string array等

       引用类型有: slice map channel等

       来看个简单的程序:

package main

import (
    "fmt"
)

func main() {
    a :=[6]int{1,2,3,4,5,6}
    b := a
    b[2]=7
    fmt.Println(a, b)
}

        结果:[1 2 3 4 5 6] [1 2 7 4 5 6]

        可以看到a和b不同, 这很好理解, 继续看程序:

package main

import (
    "fmt"
)

func main() {
    a :=[]int{1,2,3,4,5,6}
    b := a
    b[2]=7
    fmt.Println(a, b)
}

       结果是:[1 2 7 4 5 6] [1 2 7 4 5 6]

       a和b居然相同, 仅仅由array变成slice, a和b居然就同时变化, 这是为毛毛? 

       要注意, 这里的a是slice, 是引用类型,  b:=a时, 实际上是b对a的引用, 所以a和b可以理解为是同一个东东。 c/c++的学习这尤其需要注意这点。

扫描二维码关注公众号,回复: 2847799 查看本文章

        再来看个程序:

package main

import (
    "fmt"
)

func fun(m map[string]int){
    m["good"] = 10000;
}

func main() {
    x := make(map[string]int)
    x["good"] = 10
    
    fun(x)
    fmt.Println(x)
}

        熟悉c/c++的人肯定说, 结果是10, 然而,在go中, 是10000, 看看打印的结果:map[good:10000]

        这是为毛毛呢? 因为在go中, map是引用类型, 所以结果如上, c/c++程序员们, 得注意啊。

猜你喜欢

转载自blog.csdn.net/stpeace/article/details/81751297