接口的理解
在Go中的接口就是一些方法的集合,在接口只能定义方法,不能像Java那样还能定义一些常量。并且在Go中接口的实现方式,采用的是Duck Type
,只要某个结构具有接口的方法,那么就实现了接口。Go中的接口,是隐式实现的,不必显示的声明。例如:
1 2 3 4 5 6 7 8 9 10 11
| 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
|
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.Connect()
pc.name = "andriod" usb.Connect()
}
|