Подтвердить что ты не робот

Golang: не может набирать переключатель без значения интерфейса

Я играю с утверждением типа с использованием следующего фиктивного кода, и я получил ошибку:

не может вводить значение "без интерфейса"

Кто-нибудь знает, что это значит?

package main

import "fmt"
import "strconv"

type Stringer interface {
    String() string
}

type Number struct {
    v int
}

func (number *Number) String() string {
    return strconv.Itoa(number.v)
}

func main() {
    n := &Number{1}
    switch v := n.(type) {
    case Stringer:
        fmt.Println("Stringer:", v)
    default:
        fmt.Println("Unknown")
    }
}

http://play.golang.org/p/Ti4FG0m1mc

4b9b3361

Ответ 1

Для переключателей типа требуется интерфейс для интроспекции. Если вы передаете ему значение известного типа, оно бомбит. Если вы создаете функцию, которая принимает интерфейс в качестве параметра, он будет работать:

func typeSwitch(tst interface{}) {
    switch v := tst.(type) {
        case Stringer:
           fmt.Println("Stringer:", v)
        default:
           fmt.Println("Unknown")
    }
}

Смотрите полный код здесь http://play.golang.org/p/QNyf0eG71_ и документацию golang на интерфейсах http://golang.org/doc/effective_go.html#interfaces.

Ответ 2

Я понял ответ, который должен отличать n до interface{} до утверждения типа:

switch v := interface{}(n).(type)

Ответ 3

В Go нет никаких типов. Вы делаете преобразование типа.