Go接口interface
Go语言中interface是一种类型,一种抽象的类型。
实现接口的条件:一个结构体只有实现了某个接口的全部方法,才算是实现了某个接口。
指针接受者与值接受者实现接口的区别:
使用值接受者实现接口方法时:结构体的值变量或者指针都能保存到接口变量中。
使用指针接收者实现接口方法时:只能将结构体指针保存到接口变量中。
package main
import "fmt"
//定义一个抽象类型,只要实现了Say()方法的结构体都可以称为Sayer类型
type mover interface{
move()
}
type person struct {
name string
age int32
}
//使用值接受者实现接口:类型的值和类型的指针变量都能保存到接口变量中
// func(p person)move(){
// fmt.Printf(p.name,"在跑\n")
// }
//使用指针接收者实现接口:使用指针接受者实现了接口的方式时,无法将值变量赋值给接口类型变量
func(p *person)move(){
fmt.Println(p.name,"在跑")
}
func main() {
var m mover
// p1 := person{
// name: "huige",
// age: 18,
// }
//m= p1 使用指针接受者实现了接口的方式时,无法将值变量赋值给接口类型变量
p2 := &person{
name: "jiange",
age: 20,
}
m= p2
m.move()
}
接口可以嵌套
type mover interface{
move()
}
type sayer interface{
say()
}
type animal interface{
mover
sayer
}
空接口
空接口是指没有方法的接口类型,因此任意类型都实现了空接口,因此空接口可以存储任意类型。
func main() {
var x interface{} //定义一个空接口变量
x = "hello"
x =false
x = 10
fmt.Println(x)
}
空接口主要使用在函数参数,和map值中。
//作为map类型的value
var m = make(map[string]interface{},16)
m["hui"] = 10
m["jian"] = false
//作为函数参数
func test(x interface{}){
fmt.Println(x)
}
类型断言
var x interface{}
x = "hello"
x =false
x = 10
fmt.Println(x)
ret ,ok:=x.(int) //猜的不对时返回断言的类型的0值,ok返回false
if ok==true {
fmt.Println("guess true ret:=",ret)
}