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
Ответы
Ответ 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 нет никаких типов. Вы делаете преобразование типа.