为什么详细给出的GO语言程序中的接口字段访问有效?

时间:2015-12-13 05:31:40

标签: go interface

我在以下链接的代码中定义了2个接口{Main,Sub}和一个结构HumanStruct。我知道为什么s1。(Main).Title()有效。但我想知道为什么m。(Sub).Name()有效。这里' m'是接口Main类型的变量。此主界面没有字段' Sub'。它是如何工作的?

package main

import "fmt"

type Main interface {
    Title() string
}

type Sub interface {
    Main
    Name() string
}

type HumanStruct struct {
    name  string
    title string
}

func (hs HumanStruct) Name() string {
    return hs.name
}

func (hs HumanStruct) Title() string {
    return hs.title
}

func main() {
    h := HumanStruct{name: "John", title: "Kings"}

    var m Main
    m = h

    var s1 Sub
    s1 = h

    fmt.Println("From main: ", m.(Sub).Name())
    fmt.Println("From sub:  ", s1.(Main).Title())
}

1 个答案:

答案 0 :(得分:4)

类型断言表达式m.(Sub)的结果是Sub类型。界面Sub有一个Name()方法,您可以调用它。

mSub的类型断言成功,因为m中的值为HumanStruct且该类型满足Sub接口。