golang多种情况下的类型开关

时间:2016-11-13 14:42:31

标签: go

当我运行下面的代码片段时,它会引发错误

  

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()
    }

现在好了。

1 个答案:

答案 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()
    }
}