Go 中具有多种情况的类型开关
当使用具有多种情况的类型开关时,可能会遇到错误,指出变量具有多种类型的情况是未定义的。此行为源于 Go 语言规范,该规范规定类型切换保护可以包含简短的变量声明。
在这种情况下,变量的类型与单类型情况中列出的类型相同。但是,在具有多种类型列表的情况下,变量具有类型开关保护中表达式的类型。
为了说明这一点,请考虑以下代码:
type A struct { a int } func (this *A) test() { fmt.Println(this) } type B struct { A } var foo interface{} foo = A{} switch a := foo.(type) { case B, A: a.test() }
运行此代码将导致错误“a.test undefined(类型interface {}是没有方法的接口)”。这是因为变量 a 具有类型 interface{},而不是特定情况的类型。
要解决此问题,可以断言类型开关保护表达式具有预期的方法。例如:
type tester interface { test() } func main() { var foo interface{} foo = &B{} if a, ok := foo.(tester); ok { fmt.Println("foo has test() method") a.test() } }
这段代码首先检查 foo 是否有 test() 方法,如果有,则将 foo 的值赋给 a 并调用 test() 方法。
以上是为什么 Go 中具有多个 case 的类型切换会导致'未定义”变量错误,如何解决?的详细内容。更多信息请关注PHP中文网其他相关文章!