質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

解決済

1回答

277閲覧

golangの型(インターフェース?)によって処理を変える

退会済みユーザー

退会済みユーザー

総合スコア0

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2017/08/19 06:25

編集2017/08/19 07:17

GoでtwitterAPIを扱うことができるライブラリであるanacondaの使い方を調べていたところ、この記事を見つけました。

その中の

go

1twitterStream := api.PublicStreamSample(nil) 2 for { 3 x := <-twitterStream.C 4 switch tweet := x.(type) { 5 case anaconda.Tweet: 6 fmt.Println(tweet.Text) 7 fmt.Println("-----------") 8 case anaconda.StatusDeletionNotice: 9 // pass 10 default: 11 fmt.Printf("unknown type(%T) : %v \n", x, x) 12 } 13 }

ここのswitch構文。
これは型によって処理を変えるような部分かなと推測したのですが、tweet := x.(type)の部分で何をやっているのかわかりません。
それと、これをif文で書き換えるとするとどのようになるか教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

switch tweet := x.(type) { case anaconda.Tweet: fmt.Println(tweet.Text) fmt.Println("-----------") case anaconda.StatusDeletionNotice: // pass default: fmt.Printf("unknown type(%T) : %v \n", x, x) }

golang で x.(SomeType) とすると type assertion になるのですが、switch tweet := x.(type) に関しては type switch 構文という構文なので特に意識する必要なく、こういう構文だと思って下さい。
ちなみに type assertion とは interface x が () の中の型に変換する事を明示します。そのまま式として使用する事も出来ますが、本当に正しく型変換できたかどうかを2個目の戻り値でチェックできます。

v, ok := x.(SomeType)

x が SomeType であれば ok が true になります。気を付けないといけないのは、これが出来るのは x が interface である場合のみです。

またこれを if 文で書き換えると以下になります。

if tweet, ok := x.(anaconda.Tweet); ok { fmt.Println(tweet.Text) fmt.Println("-----------") } else if tweet, ok := x.(anaconda.StatusDeletionNotice); ok { // pass } else { fmt.Printf("unknown type(%T) : %v \n", x, x) }

投稿2017/08/19 11:32

編集2017/08/19 11:36
mattn

総合スコア5030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/08/19 12:03

毎回、完璧かつ丁寧な解説ありがとうございます。 まさしく望んでいた通りの回答をいただけたためベストアンサーとさせていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問