接口(interface)的定義
接口代表一種調用契約,是多個方法聲明的集合。接口要實現的是做什麼,而不關心如何做。接口最常見的使用場景是對包外提供訪問,或預留擴展空間。
Go語言接口實現機制很簡潔,只要目標類型方法集內包含接口聲明的全部方法,就被視爲實現了該接口,無需做顯示聲明,當然目標類型可實現多個接口。
其實接口也是一中結構,只是編譯器會對其做出很多限制:
- 不能有字段
- 不能定義自己的方法
- 只能聲明方法,不能實現
- 可嵌入其它接口類型
接口通常以er作爲後綴,方法名是聲明組成部分,但參數名可不同或省略。
package main
import(
"fmt"
)
type tester interface{ //方法
test()
string() string
}
type data struct{}
func (*data)test(){}
func (data)string()string{
return "Hello word"
}
func main(){
var d data
var t tester = &d
t.test()
fmt.Println(t.string())
}
如果接口沒有任何方法聲明,那麼它就是一個空接口(interface{}),它的用途非常廣泛可被賦值爲任何類型的對象。接口變量默認值時nil,如果實現接口的類型支持可做相等運算。
package main
import(
"fmt"
)
func main(){
var a,b interface{}
fmt.Println(a == nil,a == b)
a,b = 10,10
fmt.Println(a == b)
}
輸出:
true true
true
可以像匿名字段那樣嵌入其它接口。目標類型方法集中必須擁有包含嵌入接口方法在內的全部方法纔算實現了該接口。嵌入其它接口類型相當於將其聲明的方法集導入。這就要去不能有同名方法,因爲不支持重載。不能嵌入自身或循環嵌入這樣會導致遞歸錯誤。接口可直接用於變量定義,或作爲結構字段類型。