Объяснение проверки, реализует ли значение интерфейс

Я прочитал "Эффективный ход" и другие вопросы и ответы: проверка соответствия типа совместимости 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

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

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

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]

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

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

Ответ 2

Следующее будет работать:

val:=MyType("hello")
var i interface{}=val
v, ok:=i.(Somether)