当我运行下面的代码片段时,它会引发错误
a.test undefined(type 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()
}
现在好了。
答案 0 :(得分:4)
这是由the spec定义的正常行为(强调我的):
TypeSwitchGuard可能包含一个简短的变量声明。使用该表单时,变量在每个子句中的隐式块的开头声明。 在具有仅列出一种类型的案例的子句中,变量具有该类型;否则,该变量具有TypeSwitchGuard 中表达式的类型。
因此,事实上,类型开关确实生效,但变量a
保持类型interface{}
。
解决这个问题的一种方法是assert 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()
}
}