本文通过一个小比如引出:
i := 100
a := interface{}(i)
fmt.Printf("%T---%v\n", a,a) //int---100
刚开始一直以为类型打印成果会是interface
,没想到居然是int
咱们知道一个interface的结构包括两部分:类型和值:
依据接口是否包括办法,可以将接口分为 iface
和 eface
。
eface
eface,表明不带有办法的接口。结构图如下:
当定义一个空接口的时分,var empty interface{}
此刻的类型和值都是nil
,如下图:
如果这个时分进行赋值:empty = 100
那么类型就会变为int
,值变为100
【所以文章最初的比如为什么打印int现在明白了吧】
iface
iface,表明带有办法的接口。结构图如下:
Go语言中,每个变量都有仅有个静态类型,这个类型是编译阶段就可以确定的。有的变量可能除了静态类型之外,还会有动态混合类型。
咱们看个网上的比如吧:
//带函数的interface
var r io.Reader
tty, err := os.OpenFile("/dev/tty", os.O_RDWR, 0)
if err != nil {
return nil, err
}
r = tty
运转,var r io.Reader
,结构图如下图:
最后一句r = tty
,结构图变为如下图:
但是记住:虽然有动态混合类型,但是对外”表现”依然是静态类型。
参阅文章【图片也出自这,感谢大神】:i6448038.github.io/2020/02/15/…