go語(yǔ)言中的interface是一組未實(shí)現(xiàn)的方法的集合,如果某個(gè)對(duì)象實(shí)現(xiàn)了接口中的所有方法,那么此對(duì)象就實(shí)現(xiàn)了此接口。與其它面向?qū)ο笳Z(yǔ)言不同的是,go中無需顯示聲明調(diào)用了哪個(gè)接口。
復(fù)制代碼 代碼如下:
package main
import (
"fmt"
)
type I interface {
Get() int
Put(int)
}
type S struct{ i int }
func (p *S) Get() int { return p.i }
func (p *S) Put(v int) { p.i = v }
type R struct{ i int }
func (p *R) Get() int { return p.i }
func (p *R) Put(v int) { p.i = v }
func f1(p I) {
fmt.Println(p.Get())
p.Put(1)
}
//interface{}空接口,能接受任何類型。.(I)是類型斷言,用于轉(zhuǎn)換something到I類型的接口
func f2(p interface{}) {
if t, ok := p.(S); ok {
fmt.Println("S:", t)
} else if t, ok := p.(I); ok {
fmt.Println("I:", t.Get())
}
}
func f3(p interface{}) {
switch t := p.(type) {
case S:
fmt.Println("S:", t.Get())
case R:
fmt.Println("R:", t.Get())
case I:
fmt.Println("I:", t.Get())
default:
fmt.Println("unknow type")
}
}
func main() {
s := S{101}
f1(s)
f2(s)
r := R{1111}
f3(r)
}
如上結(jié)構(gòu)S實(shí)現(xiàn)了I的兩個(gè)方法,因此S實(shí)現(xiàn)了I。因?yàn)镾實(shí)現(xiàn)了I,因此可以調(diào)用f向其傳遞S類型值得指針。
總結(jié)如下:
(1)使用“comma, ok” 來判斷一個(gè)接口類型是否實(shí)現(xiàn)了某個(gè)特定接口:
復(fù)制代碼 代碼如下:
if t, ok := something.(I) ; ok {
// 對(duì)于某些實(shí)現(xiàn)了接口I 的
// t 是其所擁有的類型
}
(2)聲明為 interface 類型的變量,可以存儲(chǔ)任何實(shí)現(xiàn)了 interface 中所有方法的類型的變量
(3)空接口可代表任何類型,可做形參和返回類型
復(fù)制代碼 代碼如下:
package main
import "fmt"
func main() {
//interface{}
var i interface{} = 100
var s interface{} = "hello"
fmt.Printf("i = %d, s = %s\n", i, s)
s = i
fmt.Printf("i = %d, s = %d\n", i, s)
}
(4)interface組合
將一個(gè) interface1 嵌入到另一個(gè) interface2 的聲明中,其作用相當(dāng)于把 interface1 的函數(shù)包含到 interface2 中,但是組合中不同有重復(fù)的方法
注:
a. 只要兩個(gè)接口中的方法列表相同(與順序無關(guān)),即為相同的接口,可以相互賦值
b. interface1 的方法列表屬于另一個(gè) interface2 的方法列表的子集,interface2 可以賦值給 interface1,反之不成立(因?yàn)榉椒ㄈ笔?,interface2 中的方法會(huì)覆蓋 interface1 中同名的方法
c. 可以嵌入包中的 interface
您可能感興趣的文章:- Go語(yǔ)言中你不知道的Interface詳解
- golang中interface接口的深度解析
- Go語(yǔ)言interface 與 nil 的比較
- 淺談Go語(yǔ)言中的結(jié)構(gòu)體struct & 接口Interface & 反射
- Go語(yǔ)言interface詳解
- Go之interface的具體使用