2015-01-06 2 views
8

Я прочитал «Эффективный ход» и другие вопросы Q & Как это: golang interface compliance compile type check, но, тем не менее, я не могу понять, как использовать эту технику.Объяснение проверки того, реализует ли значение интерфейс. Golang

Пожалуйста, смотрите пример:

type Somether interface { 
    Method() bool 
} 

type MyType string 

func (mt MyType) Method2() bool { 
    return true 
} 

func main() { 
    val := MyType("hello") 

    //here I want to get bool if my value implements Somether 
    _, ok := val.(Somether) 
    //but val must be interface, hm..what if I want explicit type? 

    //yes, here is another method: 
    var _ Iface = (*MyType)(nil) 
    //but it throws compile error 
    //it would be great if someone explain the notation above, looks weird 
} 

Есть ли простые способы (например, без использования отражения) проверки значения, если он реализует интерфейс?

+1

как о _, хорошо: = интерфейс {} (значение) (Somether).? – c0ming

ответ

14

Вам нужно только проверить, реализует ли значение интерфейс, если вы не знаете тип значения. Если тип известен, эта проверка автоматически выполняется компилятором.

Если вы действительно хотите, чтобы проверить в любом случае, вы можете сделать это со вторым способом вы дали:

var _ Somether = (*MyType)(nil) 

который будет ошибка при компиляции:

prog.go:23: cannot use (*MyType)(nil) (type *MyType) as type Somether in assignment: 
    *MyType does not implement Somether (missing Method method) 
[process exited with non-zero status] 

Что вы здесь делаете, присваивает указателю MyType тип (и значение nil) переменной переменной Somether, но поскольку имя переменной равно _, ее игнорируют.

Если MyType реализован Somether, он не будет компилировать и делать ничего

+0

спасибо, что посмотрели! –

+0

Любая причина, по которой черный идентификатор необязательно должен быть '* Somether', так как правая рука имеет * указатель * на' MyType'? Я все еще учусь. :-) –

+0

вы можете думать о значении интерфейса как контейнере, вы можете поместить все, что хотите в нем, если оно реализует правильные методы. Он может содержать указатель на структуру или структуру напрямую. Как правило, вам не нужно указывать указатель на значение интерфейса –