Interface 无法在非接口值上键入开关
我正在使用以下伪代码处理类型断言,结果出现了错误: 无法在非接口值上键入开关 有人知道那是什么意思吗Interface 无法在非接口值上键入开关,interface,go,type-conversion,Interface,Go,Type Conversion,我正在使用以下伪代码处理类型断言,结果出现了错误: 无法在非接口值上键入开关 有人知道那是什么意思吗 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.
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")
}
}
类型开关需要一个用于内省的接口。如果将已知类型的值传递给它,它会爆炸。如果您创建了一个接受接口作为参数的函数,它将工作:
func typeSwitch(tst interface{}) {
switch v := tst.(type) {
case Stringer:
fmt.Println("Stringer:", v)
default:
fmt.Println("Unknown")
}
}
请参阅此处的完整代码和有关接口的golang文档。我找到了答案,即在类型断言之前将
n
转换为interface{}
:
switch v := interface{}(n).(type)
Go中没有任何类型转换。您正在进行类型转换。有两种类型转换
谢谢,@dehtron5000。我缺少的是在
类型断言
之前需要显式转换到接口{}
。这个答案对我帮助很大。我正在用结构类型的开关解决一些更复杂的情况,但这将我推向了wright的方向。谢谢你,伙计。登录只是为了告诉你)这个答案对我帮助很大。我正在用结构类型的开关解决一些更复杂的情况,但这将我推向了wright的方向。谢谢你,伙计。登录只是为了告诉您)但是对已知类型执行类型断言有什么意义呢?@newacct是的,在生产代码中,如果类型已经已知,您当然不会执行类型断言。本练习的重点是理解类型断言。在现实生活中没有理由使用此代码,因为任何非接口变量(即,n
)在源代码中已经有一个无法更改的已知类型。如果它被声明为int,你就知道它是int。我很想知道为什么它有这么多的赞成票?当然,人们正在寻找一个用例,因为某种原因,我有一个指向结构的指针数组,当我操作数组(添加的项)时,当我尝试键入assert时,它就不是一个接口了。转换到接口{}修复了“非接口类型位于左侧”错误。我的案例是使用mapsyes解析yaml文件,因此简短的回答是,如果Go知道输入的类型,则类型转换/断言的输入是错误的。因此,您必须将输入强制转换到接口{}中,以了解如何在外部函数或类似于此处所示的函数中进行转换。