web-dev-qa-db-ja.com

キーワードvarの後のアンダースコアとインターフェース名はどういう意味ですか?

から http://golang.org/src/pkg/database/sql/driver/types.go

type ValueConverter interface {
    // ConvertValue converts a value to a driver Value.
    ConvertValue(v interface{}) (Value, error)
}

var Bool boolType

type boolType struct{}

var _ ValueConverter = boolType{} // line 58

func (boolType) String() string { return "Bool" }

func (boolType) ConvertValue(src interface{}) (Value, error) {....}

ValueConverterがインターフェイス名であることを知っていました。 58行目では、boolTypeがインターフェースValueConverterを実装することを宣言しているようですが、それは必要ですか? 58行目を削除したところ、コードは正常に機能しました。

71
dilfish

boolTypeValueConverterインターフェースを満たしていることを静的(コンパイル時)チェックします。 _変数の名前として使用すると、RHS値を効果的に破棄するが、副作用があるかどうかをタイプチェックして評価するようコンパイラーに指示しますが、匿名変数自体はプロセススペースをとりません。

これは、開発時に便利な構成であり、インターフェイスのメソッドセットや型によって実装されるメソッドが頻繁に変更されます。コンストラクトは、互換性を持たせることを目的とするタイプとインターフェースのメソッドセットを一致させることを忘れないようにするためのガードとして機能します。効果的にgo installそのような省略がある壊れた(中間)バージョン。

97
zzzz

タイプValueConverterのダミー値を作成し、それに新しいboolTypeオブジェクトを割り当てて、それを破棄しているようです(これは、for _, elt := range myRange { ...}のように、goのアンダースコアの意味です)列挙のインデックスには興味がありません)。

私の推測では、構造体boolTypeValueConverterインターフェースを実装していることを確認するための静的チェックに対応しているだけです。このように、boolTypeの実装を変更すると、新しいValueConverterをにキャストできなくなるため、boolTypeインターフェースの実装を壊した場合、コンパイラは早期に文句を言うでしょう。このインターフェース。

20
val