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

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

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

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

Q&A

解決済

1回答

11568閲覧

Goのアンダースコアはどんな意味なのでしょうか?

yoppy0066

総合スコア293

Go

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

0グッド

2クリップ

投稿2016/12/08 14:46

コード見ていたら以下のような記述があったのですが、これはどのような意味なのでしょうか?

var _ Foo = &Bar{}

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

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

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

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

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

guest

回答1

0

ベストアンサー

確認しましたが、コンパイルエラーになりました。そのような書き方はありません。
写し間違えてませんか?

golangでは複数の値を戻り値として受け取ることができます。

go

1b, err := ioutil.ReadAll(con) // con読み取り 2if err != nil{ // エラーハンドリング 3 fmt.Println("エラーが発生しました。プログラムを終了します。エラーメッセージ:" + err) 4 return 5} 6fmt.Println(b) // 出力

例えば、確実にエラーが出ない場合に、エラーハンドリングを省略したいことがあります。
ですが、golangでは宣言した変数を使わないとコンパイルエラーになりますよね?

go

1b, err := ioutil.ReadAll(con) // !!!errを使ってないのでコンパイルエラー!!! 2fmt.Println(b)

そのようなときに下のように書くことができます。

go

1b, _ := ioutil.ReadAll(con) // con読み取り 2fmt.Println(b) // 出力

更には、表示も一時的にさせたくないときに

go

1b, _ := ioutil.ReadAll(con) // con読み取り 2_ = b

のように、bを無理やり使用してコンパイルエラーを出さないようにすることも可能です。

つまりアンダースコアは、変数を受け取らない、何もしないという目的で使うものです。
質問したかったものはこれのことでしょうか。
ちなみにvar a = ba := bは同じです。

追記

https://github.com/gin-gonic/gin/blob/master/gin.go
こちらから引用var _ IRouter = &RouterGroup{}

下の2つを見比べてください。

go

1var str string = "あい" 2var _ IRouter = &RouterGroup{}

_は受け取らないための変数名、IRouterは型名で有ることがわかるかと思います。
正確にはIRouterは同パッケージ別ファイル内で宣言されたインタフェースでした。
例えば

go

1var str int = "いあ"

とすると型と値の不整合でコンパイルエラーになりますよね?

インターフェースでは、メソッドの実装が代入の要件になります。
つまり、RouterGroup構造体の型がIRouterインターフェースのメソッドを実装していればコンパイルでき、そうでなければコンパイルエラーなる。
それがvar _ IRouter = &RouterGroup{}の目的です。

また、このパッケージのソースを見た人がvar _ IRouter = &RouterGroup{}という一文を見れば、「RouterGroupは常にIRouterインターフェースを実装しているんだな」ということが一目瞭然です。

正直このソースを見るまでこんな書き方があるなんて思いつきもしませんでした。勉強になります。
今後使っていきたいテクニックですね

投稿2016/12/08 15:22

編集2016/12/09 01:02
intelf___

総合スコア868

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

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

yoppy0066

2016/12/08 15:35 編集

あ、すみません。戻り値が同じ型なのですかね EngineはRouterGroupを継承しているから。。。ということなのでしょうか。。。
intelf___

2016/12/09 00:44

追記する形で修正しておきます。
yoppy0066

2016/12/09 01:42

ありがとうございました!理解できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問