Consider this program (https://play.golang.org/p/V0fu9rD8_D)

        package main

        import (
                "fmt"
        )

        func main() {
                c := make(chan int, 1)
                c <- 1
                d := <-chan int(c)
                fmt.Printf("%T\n", d)
                e := (<-chan int)(c)
                fmt.Printf("%T\n", e)
        }

Its output is

        int
        <-chan int

Intuitively it seems ok (and I believe the output is correct). Let's look
closer on the RHS expression of line

                d := <-chan int(c)

>From the specs:

Expression <https://golang.org/ref/spec#Expression> = UnaryExpr
<https://golang.org/ref/spec#UnaryExpr> | Expression
<https://golang.org/ref/spec#Expression> binary_op
<https://golang.org/ref/spec#binary_op> Expression
<https://golang.org/ref/spec#Expression> .
UnaryExpr <https://golang.org/ref/spec#UnaryExpr> = PrimaryExpr
<https://golang.org/ref/spec#PrimaryExpr> | unary_op
<https://golang.org/ref/spec#unary_op> UnaryExpr
<https://golang.org/ref/spec#UnaryExpr> .
unary_op <https://golang.org/ref/spec#unary_op> = "+" | "-" | "!" | "^" |
"*" | "&" | "<-" .
PrimaryExpr <https://golang.org/ref/spec#PrimaryExpr> = Operand
<https://golang.org/ref/spec#Operand> | Conversion
<https://golang.org/ref/spec#Conversion> | PrimaryExpr
<https://golang.org/ref/spec#PrimaryExpr> Selector
<https://golang.org/ref/spec#Selector> | PrimaryExpr
<https://golang.org/ref/spec#PrimaryExpr> Index
<https://golang.org/ref/spec#Index> | PrimaryExpr
<https://golang.org/ref/spec#PrimaryExpr> Slice
<https://golang.org/ref/spec#Slice> | PrimaryExpr
<https://golang.org/ref/spec#PrimaryExpr> TypeAssertion
<https://golang.org/ref/spec#TypeAssertion> | PrimaryExpr
<https://golang.org/ref/spec#PrimaryExpr> Arguments
<https://golang.org/ref/spec#Arguments> .
Conversion <https://golang.org/ref/spec#Conversion> = Type
<https://golang.org/ref/spec#Type> "(" Expression
<https://golang.org/ref/spec#Expression> [ "," ] ")" .
Type <https://golang.org/ref/spec#Type> = TypeName
<https://golang.org/ref/spec#TypeName> | TypeLit
<https://golang.org/ref/spec#TypeLit> | "(" Type
<https://golang.org/ref/spec#Type> ")" .
TypeLit <https://golang.org/ref/spec#TypeLit> = ArrayType
<https://golang.org/ref/spec#ArrayType> | StructType
<https://golang.org/ref/spec#StructType> | PointerType
<https://golang.org/ref/spec#PointerType> | FunctionType
<https://golang.org/ref/spec#FunctionType> | InterfaceType
<https://golang.org/ref/spec#InterfaceType> | SliceType
<https://golang.org/ref/spec#SliceType> | MapType
<https://golang.org/ref/spec#MapType> | ChannelType
<https://golang.org/ref/spec#ChannelType> .
ChannelType <https://golang.org/ref/spec#ChannelType> = ( "chan" | "chan"
"<-" | "<-" "chan" ) ElementType <https://golang.org/ref/spec#ElementType> .

It seems to me that parsing `<-chan int(c)` as

        a receive operation from a conversion of `c` to type `chan int`

is as valid as parsing it as

        a conversion of `c` to type `<-chan int`.

In the later case the program would output

        <-chan int
        <-chan int

I must be missing something. Which rule selects the first parse? Can
anybody please enlighten me? Thanks in advance.

-- 

-j

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to