go介面
介面實現原理和型別轉換
- 接⼝命名習慣以 er 結尾,結構體。
- 接⼝只有⽅法簽名,沒有實現。
- 接⼝沒有資料欄位。
- 可在接⼝中嵌⼊其他接⼝。
- 型別可實現多個接⼝。
原理
接⼝物件由接⼝表 (interface table) 指標和資料指標組成
struct Iface
{
Itab* tab;
void* data;
};
示例:使用介面訪問物件
type User struct {
id int
name string
}
func main() {
u := User{1, "Tom"}
var i interface{} = u
fmt.Printf("%v\n", i.(User))
}
介面轉換
示例一:判斷物件的具體介面或型別
type User struct {
id int
name string
}
func (self *User) String() string {
return fmt.Sprintf("%d, %s", self.id, self.name)
}
func main() {
var o interface{} = &User{1,"tom"}
switch v := o.(type) {
case nil: //o == nil
fmt.Println(nil)
case fmt.Stringer: //interface
fmt.Println(v)
case func() string: //func
fmt.Println(v())
case *User: //*struct
fmt.Printf("%d, %s\n", v.id, v.name)
default:
fmt.Println("unkown")
}
}
示例二:超級介面轉換為子集介面
type Stringer interface { //子集介面
String() string
}
type Printer interface { //超集介面
Stringer
Print()
}
type User struct {
id int
name string
}
func (self *User) String() string {
return fmt.Sprintf("%d, %s", self.id, self.name)
}
func (self *User) Print() {
fmt.Println(self.String())
}
func main() {
var o Printer = &User{1,"tom"}
var s Stringer = o //超集介面轉子集介面
fmt.Println(s.String())
}
相關文章
- Go介面詳談Go
- Go語言之介面Go
- Go 介面型別Go型別
- go語言的介面Go
- Go 介面:nil介面為什麼不等於nil?Go
- go sort.Interface 排序介面Go排序
- go語言學習-介面Go
- Go 介面 學習筆記Go筆記
- Go 語言 nil 和介面Go
- Go 介面:Go中最強大的魔法,介面應用模式或慣例介紹Go模式
- [Go語言寫介面]一、使用xcgui完成go語言第一個軟體介面GoGUI
- Go 語言介面詳解(一)Go
- interface 介面 -Go 學習記錄Go
- Go 語言介面詳解(二)Go
- 【Go進階—基礎特性】介面Go
- [譯] 如何在 Go 中使用介面Go
- Go 介面所在原始碼包定位Go原始碼
- 使用 Ruby on Rails 開發 Go 介面AIGo
- 清華尹成帶你實戰GO案例(38)Go 介面Go
- 使用 Go 優化我們的介面Go優化
- go 的方法集和介面斷言Go
- GO-圖形使用者介面Go
- Go語言: 生成Protobuf的Service介面Go
- Go“一個包含nil指標的介面不是nil介面”踩坑Go指標
- Go 語言介面及使用介面實現連結串列插入Go
- 使用Go呼叫第三方介面Go
- 《快學 Go 語言》第 9 課 —— 介面Go
- 認真一點學 Go:15. 介面Go
- 在 Go 語言中,我為什麼使用介面Go
- go 模仿JAVA,面向介面/鏈式程式設計GoJava程式設計
- go語言呼叫everything的SDK介面Go
- go語言介面避免無意被適配Go
- Go語言使用swagger生成介面文件GoSwagger
- 【Go學習筆記13】介面和實現Go筆記
- Go 單元測試之mock介面測試GoMock
- Go語言學習筆記 - PART9 - 介面Go筆記
- Go語言學習之路-11-方法與介面Go
- 【Golang】Go 通過結構(struct) 實現介面(interface)GolangStruct