Go 中的类型断言:解决“无法在非接口值上键入切换”错误
在 Go 中使用类型断言时,可能会遇到错误“无法在非接口值上键入 switch”。让我们通过使用自定义类型的示例来深入研究这意味着什么以及如何解决它。
考虑以下代码片段:
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") } }
运行此代码时,您将遇到错误“无法在非接口值上键入 switch”。这表明正在对非接口值执行类型断言。在本例中,n 是指向 Number 结构的指针,它不是接口。
解决方案是在尝试类型断言之前将值转换为 interface{}。这是因为类型断言只能对接口值执行。这是更正后的代码:
func main() { n := &Number{1} switch v := interface{}(n).(type) { case Stringer: fmt.Println("Stringer:", v) default: fmt.Println("Unknown") } }
现在,当您运行代码时,它将打印“Stringer:1”。这是因为将 n 强制转换为 interface{} 允许将其视为类型断言的接口值。
以上是Go 中的类型断言:为什么'无法在非接口值上进行类型切换”以及如何修复?的详细内容。更多信息请关注PHP中文网其他相关文章!