ch16、面向对象编程 - Go语言的相关接口
1、Duck Type式接口实现
接口定义与实现:
// 定义接口
type 接口名称 interface{
函数声明
}
// 定义一个struct(类似object),然后实现该行为(方法)
type GoProgrammer struct{
}
func (p *GoProgrammer) funcName() returnType {
return "fmt.Println(\"Hello World.\")"
}
实例如下:
package interfacetest
import "testing"
type Programmer interface {
WriteHelloWorld() string
}
type GoProgrammer struct {
}
func (p *GoProgrammer) WriteHelloWorld() string {
return "fmt.Println(\"Hello World.\")"
}
func TestClient(t *testing.T) {
var p Programmer // 接口变量
p = new(GoProgrammer)
t.Log(p.WriteHelloWorld())
}
与其它主要编程语言的差异:
- 接口为非入侵性,实现不依赖于接口定义
- 所有接口的定义可以包含在接口使用者的包内
Go接口注意点:
- 接口中只能有方法的声明不能有方法的实现
- 接口中只能有方法什么不能有字段
- 只有实现了接口中所有的方法, 才算实现了接口, 才能用
该接口类型
接收
package main
import "fmt"
// 1.定义一个接口
type usber interface {
start()
stop()
}
type Computer struct {
name string
model string
}
// 2.实现接口中的所有方法
func (cm Computer) start() {
fmt.Println("启动电脑")
}
func (cm Computer) stop() {
fmt.Println("关闭电脑")
}
// 2.只实现了接口中部分方法
type Phone struct {
name string
model string
}
func (p Phone) start() {
fmt.Println("启动手机")
}
func main() {
// 1.定义一个usber接口类型变量
var i usber
// 2.用usber接口类型变量接收Computer类型结构体
i = Computer{
"戴尔", "F1234"} // 实现了所有方法, 不会报错
// 3.用usber接口类型变量接收Phone类型结构体
//i = Phone{"华为", "M10"} // 只实现了部分方法, 会报错
fmt.Println(i)
}
- 和结构体一样,接口中也可以嵌入接口(但不能嵌入自己)
package main
import "fmt"
type A interface {
fna()