go struct implement interface

编译结果 结构体实现接口 结构体指针实现接口
结构体初始化变量 通过 不通过
结构体指针初始化变量 通过 通过
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
37
38
39
40
41
42
43
44
45
46
package main

import "fmt"

// Ducker 鸭子类型
type Ducker interface {
Quack()
}

// Cat cat
type Cat struct{}

// Quack cat quack
func (c Cat) Quack() {
fmt.Println("cat quack")
}

// Dog dog
type Dog struct{}

// Quack dog duack
func (d *Dog) Quack() {
fmt.Println("dog quack")
}

func main() {
// 第一种情况,结构体初始化变量,结构体实现接口
var c1 Ducker = Cat{}
c1.Quack()

// 第二种情况,结构体指针初始化变量,结构体实现接口
var c2 Ducker = &Cat{}
c2.Quack()

// 第三种情况,结构体初始化变量,结构体指针实现接口
// compiler
// cannot use (Dog literal) (value of type Dog) as Ducker value in variable declaration:
// missing method Quack (Quack has pointer receiver)
// var d1 Ducker = Dog{}
// d1.Quack()

// 第四种情况,结构体指针初始化变量,结构体指针实现接口
var d2 Ducker = &Dog{}
d2.Quack()
}

  • 结构体指针初始化变量,结构体实现接口时,能够通过指针隐式地获取到指向的结构体
  • 结构体初始化变量,结构体指针实现接口时,变量缺少指针指向它

参考