teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追記する形で修正

2016/12/09 01:02

投稿

intelf___
intelf___

スコア868

answer CHANGED
File without changes

1

追記する形で修正

2016/12/09 01:02

投稿

intelf___
intelf___

スコア868

answer CHANGED
@@ -32,4 +32,31 @@
32
32
 
33
33
  つまりアンダースコアは、変数を受け取らない、何もしないという目的で使うものです。
34
34
  質問したかったものはこれのことでしょうか。
35
- ちなみに```var a = b```と```a := b```は同じです。
35
+ ちなみに```var a = b```と```a := b```は同じです。
36
+
37
+ 追記
38
+ ---
39
+ https://github.com/gin-gonic/gin/blob/master/gin.go
40
+ こちらから引用```var _ IRouter = &RouterGroup{}```
41
+
42
+ 下の2つを見比べてください。
43
+ ```go
44
+ var str string = "あい"
45
+ var _ IRouter = &RouterGroup{}
46
+ ```
47
+ _は受け取らないための変数名、IRouterは型名で有ることがわかるかと思います。
48
+ 正確にはIRouterは同パッケージ別ファイル内で宣言されたインタフェースでした。
49
+ 例えば
50
+ ```go
51
+ var str int = "いあ"
52
+ ```
53
+ とすると型と値の不整合でコンパイルエラーになりますよね?
54
+
55
+ インターフェースでは、メソッドの実装が代入の要件になります。
56
+ つまり、RouterGroup構造体の型がIRouterインターフェースのメソッドを実装していればコンパイルでき、そうでなければコンパイルエラーなる。
57
+ それが```var _ IRouter = &RouterGroup{}```の目的です。
58
+
59
+ また、このパッケージのソースを見た人が```var _ IRouter = &RouterGroup{}```という一文を見れば、「RouterGroupは常にIRouterインターフェースを実装しているんだな」ということが一目瞭然です。
60
+
61
+ 正直このソースを見るまでこんな書き方があるなんて思いつきもしませんでした。勉強になります。
62
+ 今後使っていきたいテクニックですね