在Go语言中,接口 (interface)是一种数据类型,一种抽象的数据类型。
package main
import "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都可以直接赋值给s
var s sayer
c2 := &cat{}
s = c2
s.say()
d2 := &dog{}
s = d2
s.say()
}
打印结果:
喵喵喵~
汪汪汪~
喵喵喵~
汪汪汪~
package main
import "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 // 定义一个sayer
var m mover // 定义一个mover
p1 := person{name: "sun"}
p1.name = "Sun_1"
p1.move()
p1.say()
s = &p1 // 可以直接赋值
s.say() // 但是s只有say方法可使用
m = &p1
m.move() // 但是m只有move方法可使用
}
打印结果:
Sun_1 在动
Sun_1 在说话
Sun_1 在说话
Sun_1 在动
package main
import "fmt"
// 接口嵌套组合
type animal interface {
mover
sayer
}
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 // 定义一个sayer
var m mover // 定义一个mover
p1 := person{name: "sun"}
var a animal
a = &p1
a.move()
a.say()
s = a // 可以赋值
m = a // 可以赋值
// a = s // 不允许
s.say() // 仅有一个say方法
m.move() // 仅有一个move方法
}
打印结果:
sun 在动
sun 在说话
sun 在说话
sun 在动
可以存任何类型数据
package main
import "fmt"
func main() {
var x interface{}
x = "hello"
fmt.Println(x)
x = 1000
fmt.Println(x)
x = false
fmt.Println(x)
}
打印结果:
hello
1000
false
正在学习Go语言的PHP程序员。