Що означає підкреслення та назва інтерфейсу після ключового слова var?


80

З 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, і код працює добре.


Порожній ідентифікатор також _ може використовуватися для суворого надання ключів у структурі. Див. Це для довідки
Валлі,

Відповіді:


121

Він забезпечує статичну перевірку (час компіляції), яка boolTypeвідповідає ValueConverterінтерфейсу. _Використовуються як ім'я змінної повідомляє компілятор для ефективного скидання значення РІТ, але перевіряти тип його і оцінити його , якщо він має якісь - небудь побічні ефекти, але анонімні змінні самі по собі не несе ніякого процес простору.

Це зручна конструкція при розробці, і набір методів інтерфейсу та / або методи, реалізовані типом, часто змінюються. Конструкція служить захистом від того, щоб забути узгодити набори методів типу та інтерфейсу, де метою є їх сумісність. Він ефективно запобігає go installзламаній (проміжній) версії з таким пропуском.



27

Здається, ви створюєте фіктивне значення типу ValueConverter, присвоюєте йому новий boolTypeоб'єкт, а потім відкидаєте його (що означає підкреслення в go, як for _, elt := range myRange { ...}якщо ви не зацікавлені в індексі перерахування).

Я припускаю, що це просто відповідає статичній перевірці, щоб переконатися, що структура boolTypeдійсно реалізує ValueConverterінтерфейс. Таким чином, коли ви змінюєте реалізацію boolType, компілятор скаржиться рано, якщо ви зламали реалізацію ValueConverterінтерфейсу, оскільки він не зможе передати ваш новий boolTypeна цей інтерфейс.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.