V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
mosliu
V2EX  ›  Go 编程语言

slice 取出 传递到 channel 中的,到底是指针还是值?,请大家帮忙指导一下

  •  
  •   mosliu ·
    mosliu · 2017-11-09 16:16:53 +08:00 · 788 次点击
    这是一个创建于 2353 天前的主题,其中的信息可能已经有所发展或是发生改变。

    slice 取出 传递到 channel 中的,到底是指针还是值?

    碰到了奇怪的问题,想写个读串口程序: 在串口发送 CC AA AA 11 22 33 44 55 66 BB BB

    buf := make([]byte, 128)
        for {
            n, err := serialPort.Read(buf)
            if err != nil {
                log.Fatal(err)
            }
            recvChan <- buf[:n]
        }
    

    这个在执行的时候,从 channel 中取出的时候是

    b: [170]
    b: [170 170 17 34 51 68 85 102 187 187]
    

    但是我第一位发的不是 170 而是 204 改一下代码

        for {
            buf := make([]byte, 128)
            n, err := serialPort.Read(buf)
            if err != nil {
                log.Fatal(err)
            }
            recvChan <- buf[:n]
    

    这样读出来就对了 是

    b: [204]
    b: [170 170 17 34 51 68 85 102 187 187]
    

    理解一下,slice 取出的是一个指针么? 可是我 channel 的定义是 recvChan chan []byte 这里传入的难道不是值么?

    这里应该怎么理解,没搜到很合适的解释,请大家帮忙讲一下

    4 条回复    2017-11-09 20:08:10 +08:00
    mosliu
        1
    mosliu  
    OP
       2017-11-09 16:20:35 +08:00   ❤️ 1
    当我没发
    初学
    是我想错了
    四大引用类型:
    slice,map,channel,interface
    sryanyuan
        2
    sryanyuan  
       2017-11-09 18:00:20 +08:00
    golang 全部是值复制 没有引用 当然我指的是 c++里的引用
    第一份代码里面 slice 底层指向的 char*是一样的 只是 len 有区别 所以其实读的是一份数据
    Hellert
        3
    Hellert  
       2017-11-09 18:32:15 +08:00
    Golang 参数传递只有一种方式:按值传递,建议可以看看 《 Go 语言实战》那本书。
    mosliu
        4
    mosliu  
    OP
       2017-11-09 20:08:10 +08:00
    @sryanyuan
    谢谢 说的没错 之前我犯了低级错误了。。

    在我看来
    slice 就是个指向数组的指针和几个控制量的集合体。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   976 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:39 · PVG 03:39 · LAX 12:39 · JFK 15:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.