コード見ていたら以下のような記述があったのですが、これはどのような意味なのでしょうか?
var _ Foo = &Bar{}
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答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 = b
とa := 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総合スコア868
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/08 15:29
2016/12/08 15:35 編集
2016/12/09 00:44
2016/12/09 01:42