отражают значение интерфейса и указатель приемника - PullRequest
0 голосов
/ 04 мая 2018

В драйвере mongodb для golang есть следующий фрагмент кода:

case reflect.Struct:
    if z, ok := v.Interface().(Zeroer); ok {
        return z.IsZero()
    }
    return false

Нулевой интерфейс определяется следующим образом:

type Zeroer interface {
    IsZero() bool
}

Когда я реализую свою структуру с

func (id SomeStruct) IsZero() bool {
    return id.ID == ""
}

это работает. Но когда я реализую метод IsZero с получателем указателя:

func (id *SomeStruct) IsZero() bool {
        return id.ID == ""
 }

утверждение типа не выполнено, и IsZero не выполняется.

Может кто-нибудь объяснить мне это?

1 Ответ

0 голосов
/ 04 мая 2018

Предположительно где-то выше case reflect.Struct есть переключатель reflect.ValueOf(...).Kind()

Если вы посмотрите на Kind s в отражающей упаковке, документы здесь

Struct - один из видов, а Ptr - другой. В операторе switch он не совпадает, потому что тип *SomeStruct, определенный в получателе метода IsZero(), равен Ptr, а не Struct.

Вам нужно будет сделать v.Elem().Interface().(Zeroer), чтобы получить базовый элемент

Пример выполнения здесь https://play.golang.org/p/tx1zgD7Ri0E

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...