7. Go 中接口的理解

接口的理解

在Go中的接口就是一些方法的集合,在接口只能定义方法,不能像Java那样还能定义一些常量。并且在Go中接口的实现方式,采用的是Duck Type,只要某个结构具有接口的方法,那么就实现了接口。Go中的接口,是隐式实现的,不必显示的声明。例如:

1
2
3
4
5
6
7
8
9
10
11
// http handler 接口
type Handler interface {
ServeHTTP(w http.ResponseWriter, r *http.Request)
}


// 实现该接口
type MyHandler struct {}
func (h MyHandler) ServeHTTP(w http.ResponseWrite, r *http.Request) {
fmt.Fprintln(w, "Hello World")
}

此时,就可以说,MyHandler就实现了http.Handler接口。在Go语言中接口的实现,可以理解为:像什么就是什么。

注意:

1
将对象赋值给接口变量时,会发生拷贝,就像函数或方法传参一样,是值拷贝。在接口变量内部存储的是指向这个复制品的指针,即无法修改复制品的状态,也无法获取指针。

也就说,将对象赋值给接口变量后,对象中的字段改变,不会反映到接口变量指向的复制品中。例子如下:

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
/**
*
* @Author fchunbo
* @Date 2019-03-31 17:35
*/
package main

import "fmt"

type USB interface {
Name() string
Connect()

}

type PhoneConnector struct {
name string
}

// 注意:和函数是可以转换的
// 并且,对于类型的方法,接收者强制为方法的第一个参数。
func (pc PhoneConnector) Name() string {
return pc.name
}

func (pc PhoneConnector) Connect() {
fmt.Println("Connected: ", pc.name)
}


func main() {
var usb USB
var pc PhoneConnector = PhoneConnector{"iPhone"}

usb = pc // 注意这里发生了值拷贝,usb内存存储了指向复制品的指针。
usb.Connect() // iPhone

pc.name = "andriod"
usb.Connect() // iPhone

}
# Go
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×