在Go语言中,接口 (interface)是一种数据类型,一种抽象的数据类型。
package mainimport "fmt"// 定义一个接口类型// 只要实现了say()的方法(所有的方法),都可以称为sayer类型type sayer interface {say()}type dog struct{}func (d *dog) say() {fmt.Println("汪汪汪~")}type cat struct{}func (c *cat) say() {fmt.Println("喵喵喵~")}// 打的函数func da(arg sayer) {arg.say()}func main() {var c1 = new(cat)da(c1) // 喵喵喵~var d1 = new(dog)da(d1) // 汪汪汪~// 直接 给变量s 定义为sayer ,c1和c2都可以直接赋值给svar s sayerc2 := &cat{}s = c2s.say()d2 := &dog{}s = d2s.say()}
打印结果:
喵喵喵~汪汪汪~喵喵喵~汪汪汪~
package mainimport "fmt"// 实现多接口type mover interface {move()}type sayer interface {say()}// 实现多接口type person struct {name string}// 实现sayer接口func (p *person) say() {fmt.Printf("%v 在说话\n", p.name)}// 实现mover接口func (p *person) move() {fmt.Printf("%v 在动\n", p.name)}func main() {var s sayer // 定义一个sayervar m mover // 定义一个moverp1 := person{name: "sun"}p1.name = "Sun_1"p1.move()p1.say()s = &p1 // 可以直接赋值s.say() // 但是s只有say方法可使用m = &p1m.move() // 但是m只有move方法可使用}
打印结果:
Sun_1 在动Sun_1 在说话Sun_1 在说话Sun_1 在动
package mainimport "fmt"// 接口嵌套组合type animal interface {moversayer}type mover interface {move()}type sayer interface {say()}// 实现多接口type person struct {name string}// 实现sayer接口func (p *person) say() {fmt.Printf("%v 在说话\n", p.name)}// 实现mover接口func (p *person) move() {fmt.Printf("%v 在动\n", p.name)}func main() {var s sayer // 定义一个sayervar m mover // 定义一个moverp1 := person{name: "sun"}var a animala = &p1a.move()a.say()s = a // 可以赋值m = a // 可以赋值// a = s // 不允许s.say() // 仅有一个say方法m.move() // 仅有一个move方法}
打印结果:
sun 在动sun 在说话sun 在说话sun 在动
可以存任何类型数据
package mainimport "fmt"func main() {var x interface{}x = "hello"fmt.Println(x)x = 1000fmt.Println(x)x = falsefmt.Println(x)}
打印结果:
hello1000false
正在学习Go语言的PHP程序员。