本文通过一个小比如引出:

i := 100
a := interface{}(i)
fmt.Printf("%T---%v\n", a,a) //int---100

刚开始一直以为类型打印成果会是interface,没想到居然是int

咱们知道一个interface的结构包括两部分:类型和值:

Golang接口的iface 和 eface

依据接口是否包括办法,可以将接口分为 ifaceeface

eface

eface,表明不带有办法的接口。结构图如下:

Golang接口的iface 和 eface

当定义一个空接口的时分,var empty interface{}

此刻的类型和值都是nil,如下图:

Golang接口的iface 和 eface

如果这个时分进行赋值:empty = 100

那么类型就会变为int,值变为100【所以文章最初的比如为什么打印int现在明白了吧】

Golang接口的iface 和 eface

iface

iface,表明带有办法的接口。结构图如下:

Golang接口的iface 和 eface

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,结构图如下图:

Golang接口的iface 和 eface

最后一句r = tty,结构图变为如下图:

Golang接口的iface 和 eface

但是记住:虽然有动态混合类型,但是对外”表现”依然是静态类型。

参阅文章【图片也出自这,感谢大神】:i6448038.github.io/2020/02/15/…