31 說說 Go 語言中的空介面

2021-10-06 23:13:49 字數 3977 閱讀 6748

空介面是特殊形式的介面型別,普通的介面都有方法,而空介面沒有定義任何方法口,也因此,我們可以說所有型別都至少實現了空介面。

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...