8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Go 2Advent Calendar 2020

Day 3

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

Last updated at Posted at 2020-12-02

はじめに

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

8
1
0

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
  3. You can use dark theme
What you can do with signing up
8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?