Go接口interface
Go語言中interface是一種類型,一種抽象的類型。
實現(xiàn)接口的條件:一個結(jié)構(gòu)體只有實現(xiàn)了某個接口的全部方法,才算是實現(xiàn)了某個接口。
指針接受者與值接受者實現(xiàn)接口的區(qū)別:
使用值接受者實現(xiàn)接口方法時:結(jié)構(gòu)體的值變量或者指針都能保存到接口變量中绘雁。
使用指針接收者實現(xiàn)接口方法時:只能將結(jié)構(gòu)體指針保存到接口變量中。
package main
import "fmt"
//定義一個抽象類型援所,只要實現(xiàn)了Say()方法的結(jié)構(gòu)體都可以稱為Sayer類型
type mover interface{
move()
}
type person struct {
name string
age int32
}
//使用值接受者實現(xiàn)接口:類型的值和類型的指針變量都能保存到接口變量中
// func(p person)move(){
// fmt.Printf(p.name,"在跑\n")
// }
//使用指針接收者實現(xiàn)接口:使用指針接受者實現(xiàn)了接口的方式時庐舟,無法將值變量賦值給接口類型變量
func(p *person)move(){
fmt.Println(p.name,"在跑")
}
func main() {
var m mover
// p1 := person{
// name: "huige",
// age: 18,
// }
//m= p1 使用指針接受者實現(xiàn)了接口的方式時,無法將值變量賦值給接口類型變量
p2 := &person{
name: "jiange",
age: 20,
}
m= p2
m.move()
}
接口可以嵌套
type mover interface{
move()
}
type sayer interface{
say()
}
type animal interface{
mover
sayer
}
空接口
空接口是指沒有方法的接口類型任斋,因此任意類型都實現(xiàn)了空接口继阻,因此空接口可以存儲任意類型。
func main() {
var x interface{} //定義一個空接口變量
x = "hello"
x =false
x = 10
fmt.Println(x)
}
空接口主要使用在函數(shù)參數(shù)废酷,和map值中瘟檩。
//作為map類型的value
var m = make(map[string]interface{},16)
m["hui"] = 10
m["jian"] = false
//作為函數(shù)參數(shù)
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)
}