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

请教一个 Go 语言的 select 语法问题

  •  
  •   bwangel ·
    bwangelme · 2018-07-19 09:32:09 +08:00 · 2078 次点击
    这是一个创建于 2318 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在看 Go 语言 select 语法文档的时候文档地址,发现了这样的一条定义。

    RecvStmt   = [ ExpressionList "=" | IdentifierList ":=" ] RecvExpr .
    

    这条定义我的理解是RecvStmt可以通过 表达式列表 = RecvExpr 的形式来定义。

    对于这里,我感到比较困惑,表达式不应该是用来求值的吗,应该不可以用来赋值。哪位老哥能帮忙解释一下啊,最好能举一个相关的例子,谢谢了。

    第 1 条附言  ·  2018-07-19 11:00:32 +08:00
    感谢 V 友们的回复,我把我的理解写在了 Gist 上,大家可以参考以下:

    11 条回复    2018-07-19 10:58:42 +08:00
    chai2010
        1
    chai2010  
       2018-07-19 09:43:36 +08:00
    同疑问,mark
    torbrowserbridge
        2
    torbrowserbridge  
       2018-07-19 09:48:36 +08:00
    ```select {
    case e, ok := <-ch1:
    ...
    case e, ok := <-ch2:
    ...
    default:
    }```
    bwangel
        3
    bwangel  
    OP
       2018-07-19 09:51:08 +08:00
    @torbrowserbridge

    这个应该是后面一种定义 标识符列表 := RecvStmt
    per
        4
    per  
       2018-07-19 09:53:29 +08:00 via iPhone
    @bwangel 用表达式不是因为前面预先声明了然后直接赋值吗?
    neoblackcap
        5
    neoblackcap  
       2018-07-19 09:53:29 +08:00
    var a []int
    var c, c1, c2, c3, c4 chan int
    var i1, i2 int
    select {
    case a[f()] = <-c4:
    // same as:
    // case t := <-c4
    // a[f()] = t
    default:
    print("no communication\n")
    }
    torbrowserbridge
        6
    torbrowserbridge  
       2018-07-19 09:55:23 +08:00
    e, ok := <-ch1: 这就是一个 RecvStmt 啊
    heimeil
        7
    heimeil  
       2018-07-19 10:05:37 +08:00
    https://golang.org/ref/spec#Expressions
    Expressions 包括很多操作,比如 Index expressions, Address operators
    kangkang
        8
    kangkang  
       2018-07-19 10:39:14 +08:00
    表达式也可以是一条定义+一个判断
    reus
        9
    reus  
       2018-07-19 10:43:19 +08:00
    表达式不能赋值,但可以给表达式求值的结果赋值
    例如
    a[0]
    b.Foo
    *p
    等等
    bwangel
        10
    bwangel  
    OP
       2018-07-19 10:56:22 +08:00
    @heimeil @neoblackcap @torbrowserbridge

    感觉你们的回复,我感觉有点懂了,V2ex 的回复不能使用 markdown 太坑爹了,我写在 gist 上了。

    https://gist.github.com/bwangelme/ac6783f85687665ede3d46c605eb9bba
    torbrowserbridge
        11
    torbrowserbridge  
       2018-07-19 10:58:42 +08:00
    赞 LS
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5238 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 09:12 · PVG 17:12 · LAX 01:12 · JFK 04:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.