Go 中的类型断言:解决“无法在非接口值上进行类型切换”
在 Go 中,类型断言涉及检查某个值是否存在属于特定类型。当遇到错误“cannot type switch on non-interface value”时,这意味着正在检查的值不是接口。
考虑以下代码:
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") } }
此代码尝试在值 n 上键入 switch,该值的类型为 *Number。但是,它会导致“无法在非接口值上键入 switch”错误。
要解决此问题,我们需要在执行类型断言之前将 n 转换为接口值。这是因为类型切换只能对接口值进行。以下更正后的代码演示了这一点:
switch v := interface{}(n).(type) { case Stringer: fmt.Println("Stringer:", v) default: fmt.Println("Unknown") }
通过将 n 强制转换为 interface{},我们允许对生成的接口值执行类型切换。这使我们能够成功检查 n 是否为 Stringer 类型并打印相应的消息。
以上是为什么 Go 会抛出'无法在非接口值上键入切换”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!