空介面是特殊形式的介面型別,普通的介面都有方法,而空介面沒有定義任何方法口,也因此,我們可以說所有型別都至少實現了空介面。
type empty_iface inte***ce
每乙個介面都包含兩個屬性,乙個是值,乙個是型別。
而對於空介面來說,這兩者都是 nil,可以使用 fmt 來驗證一下
package main
import (
"fmt"
)func main()
fmt.printf("type: %t, value: %v", i, i)
}
輸出如下
type: , value:
第一,通常我們會直接使用inte***ce{}
作為型別宣告乙個例項,而這個例項可以承載任意型別的值。
package main
import (
"fmt"
)func main()
// 存 int 沒有問題
i = 1
fmt.println(i)
// 存字串也沒有問題
i = "hello"
fmt.println(i)
// 存布林值也沒有問題
i = false
fmt.println(i)
}
第二,如果想讓你的函式可以接收任意型別的值 ,也可以使用空介面
接收乙個任意型別的值 示例
package main
import (
"fmt"
)func myfunc(iface inte***ce{})
func main()
接收任意個任意型別的值 示例
package main
import (
"fmt"
)func myfunc(ifaces ...inte***ce{})
}func main()
第三,你也定義乙個可以接收任意型別的 array、slice、map、strcut,例如這邊定義乙個切片
package main
import "fmt"
func main() , 5)
any[0] = 11
any[1] = "hello world"
any[2] = int
for _, value := range any
}
坑1:空介面可以承載任意值,但不代表任意型別就可以承接空介面型別的值
從實現的角度看,任何型別的值都滿足空介面。因此空介面型別可以儲存任何值,也可以從空介面中取出原值。
但要是你把乙個空介面型別的物件,再賦值給乙個固定型別(比如 int, string等型別)的物件賦值,是會報錯的。
package main
func main() , 初始值為a, 此時i的值變為1
var i inte***ce{} = a
// 宣告b變數, 嘗試賦值i
var b int = i
}
這個報錯,它就好比可以放進行禮箱的東西,肯定能放到貨櫃裡,但是反過來,能放到貨櫃的東西就不一定能放到行禮箱了,在 go 裡就直接禁止了這種反向操作。(宣告:底層原理肯定還另有其因,但對於新手來說,這樣解釋也許會容易理解一些。)
.\main.go:11:6: cannot use i (type inte***ce {}) as type int in assignment: need type assertion
坑2::當空介面承載陣列和切片後,該物件無法再進行切片
package main
import "fmt"
func main()
var i inte***ce{}
i = sli
g := i[1:3]
fmt.println(g)
}
執行會報錯。
.\main.go:11:8: cannot slice i (type inte***ce {})
坑3:當你使用空介面來接收任意型別的引數時,它的靜態型別是 inte***ce{},但動態型別(是 int,string 還是其他型別)我們並不知道,因此需要使用型別斷言。
package main
import (
"fmt"
)func myfunc(i inte***ce{})
}func main()
輸出如下
引數的型別是 int
引數的型別是 string
01. 開發環境的搭建(goland & vs code)02. 學習五種變數建立的方法03. 詳解資料型別:**整形與浮點型**
04. 詳解資料型別:byte、rune與string
05. 詳解資料型別:陣列與切片
06. 詳解資料型別:字典與布林型別
07. 詳解資料型別:指標
08. 物件導向程式設計:結構體與繼承
09. 一篇文章理解 go 裡的函式
10. go語言流程控制:if-else 條件語句
11. go語言流程控制:switch-case 選擇語句
12. go語言流程控制:for 迴圈語句
13. go語言流程控制:goto 無條件跳轉
14. go語言流程控制:defer 延遲呼叫
15. 物件導向程式設計:介面與多型
16. 關鍵字:make 和 new 的區別?
17. 一篇文章理解 go 裡的語句塊與作用域
18. 學習 go 協程:goroutine
19. 學習 go 協程:詳解通道/通道
20. 幾個通道死鎖經典錯誤案例詳解
21. 學習 go 協程:waitgroup
22. 學習 go 協程:互斥鎖和讀寫鎖
23. go 裡的異常處理:panic 和 recover
24. 超詳細解讀 go modules 前世今生及入門使用
25. go 語言中關於包匯入必學的 8 個知識點
26. 如何開源自己寫的模組給別人用?
27. 說說 go 語言中的型別斷言?
28. 這五點帶你理解go語言的select用法
GO語言中的介面
這幾天一直在看go語言知識,其中對介面的知識點有點模糊,所以整理一下。type 介面名 inte ce注意 介面裡的方法可以為空,也就是乙個空介面。下面舉個例子 定義people介面,有乙個說名字的方法 type people inte ce 宣告了乙個people型別的變數p var p peop...
Go語言中的介面物件轉型
go語言中介面物件轉型,有2種方式。案例如下 myinte cechg project main.go package main import fmt math 1.定義乙個介面 type shape inte ce 2.矩形 type rectangle struct 3.三角形 type str...
go 語言中的繼承
go 語言中可以通過匿名field來實現繼承的效果,type t1 struct func t t1 log func t t1 print type t2 struct t2 t2 可以通過t2.log 直接訪問t1的method,就像物件導向的繼承之後一樣訪問,不過這裡要注意的傳遞到log的是t...