1 接口赋值
第一个接口
package one
type ReadWriter interface {
Read(buf []byte) (n int, err error)
Write(buf []byte) (n int, err error)
}
第二个接口
package two
type IStream interface {
Write(buf []byte) (n int, err error)
Read(buf []byte) (n int, err error)
}
在Go语言中,这两个接口实际上并无区别, 以下这些代码可编译通过
var file1 two.IStream = new(File)
var file2 one.ReadWriter = file1
var file3 two.IStream = file2
2 接口查询
这个 if 语句判断 file1 接口指向的对象实例是否是 *File 类型,如果是则执行特定代码。
var file1 Writer = ...
if _, ok := file1.(*File); ok {
...
}
3 类型查询
在Go语言中,还可以更加直截了当地询问接口指向的对象实例的类型
var v1 interface{} = ...
switch v := v1.(type) {
case int: // 现在v的类型是int
case string: // 现在v的类型是string
...
}
Go 1.18 因为泛型引入 any,这实际上是 interface{} 的别名:
type any = interface{}
此外,项目中如果想要做替换,可以通过 gofmt 将 interface{} 改为 any:
gofmt -w -r 'interface{} -> any' ./...