Go interface

本文最后更新于:3 年前

Go interface

  • 通过关键字 type 和 interface,声明出接口类 type TestInterface interface {}
  • 因为接口类型与其他数据类型不同,它是没法被实例化的。既不能通过调用 new 函数或 make 函数创建出一个接口类型的值
  • 我们通过 interface 来定义对象的一组行为方法,如果某个对象实现了某个接口类型的所有方法,则此对象就是这个接口的实现类型
    实现约束: 1. 两个方法的签名需要完全一致 2. 两个方法的名称要一模一样

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
type Pet interface {
SetName(name string)
Name() string
Category() string
}

type Dog struct {
name string
}

func (dog *Dog) SetName(name string) {
dog.name = name
}

func (dog Dog) Name() string {
return dog.name
}

func (dog Dog) Category() string {
return "dog"
}

func TestDog(t *testing.T) {
dog := Dog{"little pig"}
_, ok := interface{}(dog).(Pet)
fmt.Printf("Dog implements interface Pet: %v\n", ok) // Dog implements interface Pet: false
_, ok = interface{}(&dog).(Pet)
fmt.Printf("*Dog implements interface Pet: %v\n", ok) // *Dog implements interface Pet: true
var pet Pet = &dog
fmt.Printf("This pet is a %s, the name is %q.\n",
pet.Category(), pet.Name()) // This pet is a dog, the name is "little pig".

dog.SetName("monster")
fmt.Printf("This pet is a %s, the name is %q.\n",
pet.Category(), pet.Name()) // This pet is a dog, the name is "monster".
}

空接口

  1. 空接口可以表示任何类型
  2. 2.通过断言来将空接口转换为制定 // v,ok := p.(int) // ok = true 时转换成功

go 接口最佳实践

倾向于使用小的接口定义,很多接口只包含一个方法

1
2
3
type Reader interface {
Read(p []byte) (n int, err error)
}

较大的接口定义,可以由多个小接口定义组合而成

1
2
3
4
type ReadWrite interface {
Reader
Write
}

只依赖与必要的功能最小接口**

1
2
3
func storeData(reader Reader) error {

}

技巧

使用者来定义接口,不是先写好了个接口,然后使用者来调用

接口变量里面有实现者的类型和实现者的值

接口变量里面自带指针,
接口变量同样采用值传递,几乎不需要使用接口的指针
指针接收者实现只能以指针方式使用,值接收者的话两者都可

查看接口变量的类型
表示任何类型 interface{}
查看接口变量
type switch type Assertion


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!