当我运行下面的代码片段时,它会引发错误
a.test未定义(类型interface {}是没有方法的接口)
看来类型开关没有生效。
package main import ( "fmt" ) type A struct { a int } func(this *A) test(){ fmt.Println(this) } type B struct { A } func main() { var foo interface{} foo = A{} switch a := foo.(type){ case B, A: a.test() } }
如果我将其更改为
switch a := foo.(type){ case A: a.test() }
没关系
这是规范(强调我的)定义的正常行为:
TypeSwitchGuard可以包含一个简短的变量声明。使用该格式时,将在每个子句中隐式块的开头声明变量。 在大小写正好列出一种类型的子句中,变量具有该类型。 否则,变量具有TypeSwitchGuard中表达式的类型。
因此,实际上,类型开关确实有效,但是变量a保留type interface{}。
a
interface{}
你能解决这个问题的方法之一是断言的是foo有方法test(),这将是这个样子:
foo
test()
package main import ( "fmt" ) type A struct { a int } func (this *A) test() { fmt.Println(this) } type B struct { A } 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() } }