1 接口赋值

第一个接口

  1. package one
  2. type ReadWriter interface {
  3. Read(buf []byte) (n int, err error)
  4. Write(buf []byte) (n int, err error)
  5. }

第二个接口

  1. package two
  2. type IStream interface {
  3. Write(buf []byte) (n int, err error)
  4. Read(buf []byte) (n int, err error)
  5. }

在Go语言中,这两个接口实际上并无区别, 以下这些代码可编译通过

  1. var file1 two.IStream = new(File)
  2. var file2 one.ReadWriter = file1
  3. var file3 two.IStream = file2

2 接口查询

这个 if 语句判断 file1 接口指向的对象实例是否是 *File 类型,如果是则执行特定代码。

  1. var file1 Writer = ...
  2. if _, ok := file1.(*File); ok {
  3. ...
  4. }

3 类型查询

在Go语言中,还可以更加直截了当地询问接口指向的对象实例的类型

  1. var v1 interface{} = ...
  2. switch v := v1.(type) {
  3. case int: // 现在v的类型是int
  4. case string: // 现在v的类型是string
  5. ...
  6. }

Go 1.18 因为泛型引入 any,这实际上是 interface{} 的别名:

  1. type any = interface{}

此外,项目中如果想要做替换,可以通过 gofmt 将 interface{} 改为 any:

  1. gofmt -w -r 'interface{} -> any' ./...