教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 chan中传递map数据,传递的是引用

chan中传递map数据,传递的是引用

发布时间:2023-03-12   编辑:jiaochengji.com
教程集为您提供chan中传递map数据,传递的是引用等资源,欢迎您收藏本站,我们将为您提供最新的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对象。

传递数组类型

只需修改chan类型,其他不变。将chan类型修改为[2]int类型,其他不变。预期返回的应该是值得拷贝

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)
}

返回结果跟预期一致:

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

修改类型为slice

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为什么要这样设计了?这样设计有什么好处?

到此这篇关于“chan中传递map数据,传递的是引用”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
golang channel传递map
Golang channel 使用指南
go语言函数传递问题(map、切片、接口、chan)
golang 没有名字参数_说说不知道的Golang中参数传递
golang map笔记
Golang从入门到放弃200618--Map(1)Map的初始化和基本操作
276-go语言golang面试题知识点
golang map中结构体元素是无法取地址的
Golang语言基础教程:函数的参数
golang key map 所有_golang系列——高级语法之map

[关闭]
~ ~