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

```go 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》以及官方的语言规范。
对于这种编程规范的代码真是看都不想看,有代码洁癖
这个不是什么编程规范,也不是什么语法,是go interface的基本用法。

理解了go interface,这个例子简单得很,好吧。

要回复问题请先登录注册