golang接口的这个用法,我到还真是百思不得其解,望解惑

type I interface{}

type II interface{
f1()
}

func g2(a II) {
fmt.Println("xxx")
}

func h3(b I) {
g2(b.(II))
}

type Message struct {
Name string `json:"msg_name"`
}

func (*Message) f1() {
}

func main(){
var m = Message{
Name: "Alice",
}
h3(&m)
}

h3函数中的g2(b.(II))这到底是个什么用法?接口强制转换?不像啊,我知道b其实是从I接口动态转过来的*Message类型,那这个b.(II)算啥意思?

已邀请:

LockingCoder - 80后

赞同来自: ddxx11223

我理解是I没有任何方法约束,m符合I类型,所以h3(&m)成立;同时Message的指针接收者实现了f1方法,所以&m符合II类型,b.(II)成立。

golwei

赞同来自: ddxx11223

类型断言可以理解成转为"更具体"的类型吧.(当然Message要符合更具体)
断言的意义是显式声明.实质不产生改变.上面的Message满足 I&&II 的调用.断言只是表面一下作为II的身份.
新手理解~说错请更正.

梁昊

赞同来自: ddxx11223

由于 b 的 dynamic type (*Message) 满足接口 II,类型断言成功。
类型断言的结果 b.(II) 的 interface type 为 II,dynamic type 不变,仍为 *Message


个人感觉类型断言讲的比较清楚的有 《The Go Programming Language》以及官方的语言规范。

要回复问题请先登录注册