我使用以下虚拟代码玩类型断言,我收到错误:
无法在非界面值上键入开关
有谁知道这意味着什么?
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")
}
}
答案 0 :(得分:25)
我想出了答案,即在类型断言之前将n
强制转换为interface{}
:
switch v := interface{}(n).(type)
答案 1 :(得分:20)
类型开关需要一个内省的界面。如果你传递一个已知类型的值,它就会爆炸。如果您创建一个接受接口作为参数的函数,它将起作用:
func typeSwitch(tst interface{}) {
switch v := tst.(type) {
case Stringer:
fmt.Println("Stringer:", v)
default:
fmt.Println("Unknown")
}
}
请参阅此处的完整代码http://play.golang.org/p/QNyf0eG71_以及有关接口http://golang.org/doc/effective_go.html#interfaces的golang文档。
答案 2 :(得分:1)
类型转换有两种
转换。为此,我们可以使用直接铸造
i:= 48
str:=字符串(i)
但是使用value。(type)进行类型转换是为了在类层次结构之间进行转换(例如,我们要从接口获取特定实现的位置)。否则,我们得到上述错误。
答案 3 :(得分:0)
Go中没有类型转换。您正在进行类型转换。