はじめに
本記事はGo 2 Advent Calendar 2020の3日目の記事です。
以前Goの仕様を眺めていたところ、型はかっこをつけることでパースの優先度をつけることができることに気付きました。
Type = TypeName | TypeLit | "(" Type ")" .
~~~~~~~~~~~~
確かにいつも型を書いているところにかっこをつけても、普通にコンパイルできました。(go fmt
をかけるとかっこは1ペアになります。)
package main
import (
"fmt"
)
func main() {
var a ((((((((((((((((((((string)))))))))))))))))))) = "マカンコウサッポウ(写真)みたいだな"
fmt.Println(a)
}
送信専用channelのchannel
この仕様を見つけた時は実際にかっこが必要になるような型が全然思いつかなかったのですが、
その後精神と時の部屋で修行を続ける中で(大嘘)、ようやく一つだけ見つけることができました。それは送信専用channelのchannelの場合でした。
var c chan <-chan string
上のコードはこのままだとstringの送信専用channelのchannelに見えますが、実はstringのchannelの受信専用channelとして扱われます。go fmt
をかけると下のようになります。
var c chan<- chan string
これはType
の中のTypeLit
の中のChannelType
が以下のようになっていて、一つ目のchan
のあとにそのまま<-
も読まれるからですね。
ChannelType = ( "chan" | "chan" "<-" | "<-" "chan" ) ElementType .
~~~~~~~~~~~
なので、送信専用channelのchannelを用意したい時は、かっこをつけて優先度をつけてあげる必要があるということでした。
var c chan (<-chan string)
ちなみに送信専用channelの送信専用channelにはかっこはいらないですね。
var c <-chan <-chan string
さいごに
channel系の型は2つ以上のトークンで、型になるのが面白いですね。
では良いお年を -> <-