我在以下链接的代码中定义了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())
}
答案 0 :(得分:4)
类型断言表达式m.(Sub)
的结果是Sub
类型。界面Sub
有一个Name()
方法,您可以调用它。
m
到Sub
的类型断言成功,因为m
中的值为HumanStruct
且该类型满足Sub
接口。