1 接口赋值
第一个接口
package onetype ReadWriter interface {Read(buf []byte) (n int, err error)Write(buf []byte) (n int, err error)}
第二个接口
package twotype 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 = file1var 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的类型是intcase string: // 现在v的类型是string...}
Go 1.18 因为泛型引入 any,这实际上是 interface{} 的别名:
type any = interface{}
此外,项目中如果想要做替换,可以通过 gofmt 将 interface{} 改为 any:
gofmt -w -r 'interface{} -> any' ./...
