search
LoginSignup
1

More than 1 year has passed since last update.

posted at

updated at

Go: Typeにかっこで優先度をつける

はじめに

本記事は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つ以上のトークンで、型になるのが面白いですね。
では良いお年を -> <-

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1