chan中傳遞map數據,傳遞的是引用

寫個demo測試一下,channel中傳遞的是數據的拷貝,仍是引用?數組

預期:傳遞的是引用類型測試

package main

import (
    "fmt"
)

func main() {
    var sliceChan chan [2]map[string]int = make(chan [2]map[string]int, 2)

    //construct array
    m1 := map[string]int{
        "rows":12,
    }
    m2 := map[string]int{
        "columns":10,
    }
    bulk := [2]map[string]int{m1, m2}

    //directly read then
    sliceChan <- bulk
    e := <-sliceChan
    fmt.Println(e)

    //modify m2
    m2["finish"] = 1
    fmt.Println(e);
}

最終輸出的結果,跟預想的同樣。打印的結果說明,e使用引用的是原數據的地址。設計

[map[rows:12] map[columns:10]]
[map[rows:12] map[columns:10 finish:1]]

修改chan數據類型,下面替換爲依次替換爲數組、slice、struct對象。code

傳遞數組類型對象

只需修改chan類型,其餘不變。將chan類型修改成[2]int類型,其餘不變。預期返回的應該是值得拷貝string

func main() {
    var sliceChan chan [2]int = make(chan [2]int, 1)

    //construct array
    bulk := [2]int{1,2}

    //directly read then
    sliceChan <- bulk
    e := <-sliceChan
    fmt.Println(e)

    //modify m2
    bulk[1] = 3
    fmt.Println(e);
    fmt.Println(bulk)
}

返回結果跟預期一致:import

[1 2]
[1 2]
[1 3]

修改類型爲slicemap

func main() {
    var sliceChan chan []int = make(chan []int, 1)

    //construct array
    bulk := []int{1,2}

    //directly read then
    sliceChan <- bulk
    e := <-sliceChan
    fmt.Println(e)

    //modify m2
    bulk[1] = 3
    fmt.Println(e);
    fmt.Println(bulk)
}

跟預期一致,傳遞的跟map同樣,也是引用。返回的結果以下:數據類型

[1 2]
[1 3]
[1 3]

修改類型爲struct引用

預期當struct傳遞值類型的時候,傳遞的是值得拷貝;傳遞引用類型的時候,傳遞的是引用

func main() {
    type people struct {
        name string
        age int
    }
    var sliceChan chan people = make(chan people, 1)

    //construct array
    bulk := people{
        "zhangshan", 28,
    }

    //directly read then
    sliceChan <- bulk
    e := <-sliceChan
    fmt.Println(e)

    //modify m2
    bulk.name = "wangwu"
    fmt.Println(e);
    fmt.Println(bulk)
}

上述使用的是值拷貝,結果也確實是這樣

{zhangshan 28}
{zhangshan 28}
{wangwu 28}

當修改爲引用後,確實也是引用傳遞了。

Golang爲何要這樣設計了?這樣設計有什麼好處?

相關文章
相關標籤/搜索