在struct上使用interface {}来检查它是否满足golang中的接口

时间:2016-11-03 15:25:56

标签: go interface

给出以下代码:

package main

import (
    "fmt"
)

type work interface {
    filter() bool
}

type organ struct {
    name string
}

func (s *organ) filter () bool {
    return true;
}


func main() {
    kidney := &organ {
            name : "kidney",    
        }

    _, ok := interface{}(kidney).(work)
    fmt.Println(ok);
}

我没有完全得到以下部分:

_, ok := interface{}(kidney).(work)

在我看来,它正在将struct转换为interface{}类型,我理解,但为什么需要转换为interface{}类型来检查它是否满足另一个接口。更具体地说,为什么以下代码失败?

ok := kidney.(work)

有错误

invalid type assertion: kidney.(work) (non-interface type *organ on left)

1 个答案:

答案 0 :(得分:6)

TL; DR如果您总是知道具体类型(例如kidney),那么您不需要类型断言;只需将其传递给work变量并继续 - 编译器将保证kidney满足work接口,否则您的程序将无法编译。

首先必须将具体类型转换为interface{}的原因是因为类型断言(即动态类型检查)仅在动态类型(即接口)。对编译器在编译时可以保证的事情进行运行时类型检查是没有意义的。希望这有道理吗?