から 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行目を削除したところ、コードは正常に機能しました。
boolType
がValueConverter
インターフェースを満たしていることを静的(コンパイル時)チェックします。 _
変数の名前として使用すると、RHS値を効果的に破棄するが、副作用があるかどうかをタイプチェックして評価するようコンパイラーに指示しますが、匿名変数自体はプロセススペースをとりません。
これは、開発時に便利な構成であり、インターフェイスのメソッドセットや型によって実装されるメソッドが頻繁に変更されます。コンストラクトは、互換性を持たせることを目的とするタイプとインターフェースのメソッドセットを一致させることを忘れないようにするためのガードとして機能します。効果的にgo install
そのような省略がある壊れた(中間)バージョン。
タイプValueConverter
のダミー値を作成し、それに新しいboolType
オブジェクトを割り当てて、それを破棄しているようです(これは、for _, elt := range myRange { ...}
のように、goのアンダースコアの意味です)列挙のインデックスには興味がありません)。
私の推測では、構造体boolType
がValueConverter
インターフェースを実装していることを確認するための静的チェックに対応しているだけです。このように、boolType
の実装を変更すると、新しいValueConverter
をにキャストできなくなるため、boolType
インターフェースの実装を壊した場合、コンパイラは早期に文句を言うでしょう。このインターフェース。