0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是空接口?空接口代碼示例

馬哥Linux運維 ? 來源:cnblogs ? 2024-04-30 12:59 ? 次閱讀

接口

空接口是指沒有定義任何接口方法的接口。沒有定義任何接口方法,意味著Go中的任意對象都可以實現(xiàn)空接口(因為沒方法需要實現(xiàn)),任意對象都可以保存到空接口實例變量中。

空接口的定義方式:

1

2

type empty_int interface {

}

通常會簡寫為type empty_int interface{}。

更常見的,會直接使用interface{}作為一種類型,表示空接口。例如:

1

2

// 聲明一個空接口實例

var i interface{}

再比如函數(shù)使用空接口類型參數(shù):

func myfunc(i interface{})

在Go中很多地方都使用空接口類型的參數(shù),用的最多的fmt中的Print類方法:

1

2

$ go doc fmt Println

func Println(a 。..interface{}) (n int, err error)

空接口數(shù)據(jù)結(jié)構(gòu)

可以定義一個空接口類型的array、slice、map、struct等,這樣它們就可以用來存放任意類型的對象,因為任意類型都實現(xiàn)了空接口。

例如,創(chuàng)建一個空接口的slice:

1

2

3

4

5

6

7

8

9

10

11

12

13

package main

import “fmt”

func main() {

any := make([]interface{}, 5)

any[0] = 11

any[1] = “hello world”

any[2] = []int{11, 22, 33, 44}

for _, value := range any {

fmt.Println(value)

}

}

輸出結(jié)果:

1

2

3

4

5

11

hello world

[11 22 33 44]

《nil》

《nil》

顯然,通過空接口類型,Go也能像其它動態(tài)語言一樣,在數(shù)據(jù)結(jié)構(gòu)中存儲任意類型的數(shù)據(jù)。

再比如,某個struct中,如果有一個字段想存儲任意類型的數(shù)據(jù),就可以將這個字段的類型設(shè)置為空接口:

1

2

3

4

type my_struct struct {

anything interface{}

anythings []interface{}

}

拷貝數(shù)據(jù)結(jié)構(gòu)到空接口數(shù)據(jù)結(jié)構(gòu)

前面解釋了任意類型的對象都能賦值給空接口實例。

1

2

3

var any interface{}

any = “hello world”

any = 11

空接口是一種接口,它是一種指針類型的數(shù)據(jù)類型,雖然不嚴謹,但它確實保存了兩個指針,一個是對象的類型(或iTable),一個是對象的值。所以上面的賦值過程是讓空接口any保存各個數(shù)據(jù)對象的類型和對象的值。

換一種角度考慮,空接口有自己的內(nèi)存布局方式:兩個指針,占用兩個機器字長。

Golang給的一個經(jīng)典的示例:將某個slice中的數(shù)據(jù)拷貝到空接口slice中將報錯。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

package main

import “fmt”

func main() {

testSlice := []int{11,22,33,44}

// 成功拷貝

var newSlice []int

newSlice = testSlice

fmt.Println(newSlice)

// 拷貝失敗

var any []interface{}

any = testSlice

fmt.Println(any)

}

這是因為每個空接口的內(nèi)存布局都占用兩個機器字長的內(nèi)容。對于長度為N的空接口slice來說,它的每個元素都是以2機器字長為單元的連續(xù)空間,共占用N*2個機器字長的空間。

而普通的slice,例如上面的testSlice,它的每個元素是int類型的,int類型的內(nèi)存布局和空接口不一樣。

這些對象的內(nèi)存布局在編譯期間就已經(jīng)確定好了,所以沒法直接將不同內(nèi)存布局的數(shù)據(jù)結(jié)構(gòu)進行拷貝。

要想完成期待的拷貝,可以使用for-range的方式,將testSlice中的每個元素賦值給空接口slice的空接口元素:也就是一個個的空接口實例。

1

2

3

4

var any []interface{}

for _,value := range testSlice{

any = append(any,value)

}

這樣,空接口Slice中的每個空接口實例都指向更底層的各個數(shù)據(jù)對象。而不是像前面錯誤的拷貝方式:每個空接口元素想要當(dāng)作這些數(shù)據(jù)對象。

不僅空接口的Slice如此,其它包含空接口的數(shù)據(jù)結(jié)構(gòu),也都類似。

審核編輯:黃飛

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8902

    瀏覽量

    153065
  • 數(shù)據(jù)類型
    +關(guān)注

    關(guān)注

    0

    文章

    237

    瀏覽量

    13791

原文標題:空接口

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 0人收藏

    評論

    相關(guān)推薦
    熱點推薦

    STM32CubeMX生成STM32mp135D的USART1,2,3,6代碼初始化是的,為什么?

    用STM32CubeMX生成STM32mp135D的USART1,2,3,6代碼初始化是的,參考其他代碼做了初始化操作,可以通過HAL_USART_Transmit接口發(fā)送數(shù)據(jù),但是
    發(fā)表于 03-07 07:48

    消息郵箱發(fā)送消息和非消息產(chǎn)生一樣的效果

    原子哥,我測試消息郵箱時先定義消息為 SeMbox = OSMboxCreate((void *)0);再按鍵中斷發(fā)送消息為什么發(fā)送 OSMboxPostOpt(SeMbox,(void *)0
    發(fā)表于 05-08 06:36

    時碼.ppt

    分層時碼;基于發(fā)射分集的時碼;單輸入單輸出(SISO)到多輸入多輸出(MIMO);時碼頻譜效率高,抗平坦衰落;還不適合嚴重非平坦衰落信道。
    發(fā)表于 06-14 23:07 ?16次下載

    助聽器鋅電池

    助聽器鋅電池 助聽器鋅電池圖
    發(fā)表于 12-16 08:51 ?854次閱讀

    電池問答

    電池問答 問:鋅電池的內(nèi)部結(jié)構(gòu)是怎樣的,它是怎么工作的 電池構(gòu)造: 成
    發(fā)表于 12-16 09:07 ?930次閱讀

    分光交換(SDPS),分光交換(SDPS)是什么意思

    分光交換(SDPS),分光交換(SDPS)是什么意思 分光交換技術(shù)就是在空間域上對光信號進行交換,其基本原理是將光交換元件組成門陣列開關(guān),并適
    發(fā)表于 03-20 10:18 ?3107次閱讀

    分多址(SDMA),分多址(SDMA)是什么意思

    分多址(SDMA),分多址(SDMA)是什么意思 分多址(SDMA):這種技術(shù)是利用空間分割構(gòu)成不同的信道。舉例來說,在一顆衛(wèi)星上使用
    發(fā)表于 04-03 13:40 ?3666次閱讀

    STM32F091片使用System Bootloader下載

    STM32F091片使用System Bootloader下載代碼
    發(fā)表于 12-07 18:17 ?0次下載

    STM32F091片編程后怎樣直接運行用戶代碼

    STM32F091片編程后不能直接運行用戶代碼的分析與解決。
    的頭像 發(fā)表于 08-31 14:16 ?7572次閱讀
    STM32F091<b class='flag-5'>空</b>片編程后怎樣直接運行用戶<b class='flag-5'>代碼</b>

    API-Shop-OCR-營業(yè)執(zhí)照識別API接口Python調(diào)用示例代碼說明

    本文檔的主要內(nèi)容詳細介紹的是API-Shop-OCR-營業(yè)執(zhí)照識別API接口Python調(diào)用示例代碼說明
    發(fā)表于 01-10 11:48 ?6次下載
    API-Shop-OCR-營業(yè)執(zhí)照識別API<b class='flag-5'>接口</b>Python調(diào)用<b class='flag-5'>示例</b><b class='flag-5'>代碼</b>說明

    預(yù)器是什么,有哪些作用

    預(yù)器是電廠鍋爐中的重要設(shè)備。不同的發(fā)電機組,預(yù)器的規(guī)格類別也是有所差異的。本篇內(nèi)容泓江智造就一起和大家聊聊關(guān)于預(yù)器相關(guān)的問題。
    發(fā)表于 07-16 15:24 ?2.1w次閱讀

    圖形引擎服務(wù)場景化接口示例代碼

    簡介 圖形引擎服務(wù)場景化接口示例代碼演示了如何調(diào)用SceneView、ARView和FaceView進行圖形渲染。 開發(fā)準備 1.檢查Android Studio開發(fā)環(huán)境是否就緒。使用Android
    發(fā)表于 03-23 10:57 ?1次下載

    MPC82系列MCU的SPI(串行外圍接口)示例代碼

    MPC82系列MCU的SPI(串行外圍接口)示例代碼
    發(fā)表于 06-30 17:35 ?0次下載
    MPC82系列MCU的SPI(串行外圍<b class='flag-5'>接口</b>)<b class='flag-5'>示例</b><b class='flag-5'>代碼</b>

    python如何定義二維數(shù)組

    和列的數(shù)量,并將它們初始化為0。然后,可以使用一個for循環(huán)來逐行創(chuàng)建一個的一維列表,并使用另一個for循環(huán)來向的二維列表中添加這些一維列表。 下面是一個示例代碼,創(chuàng)建一個3行4列
    的頭像 發(fā)表于 11-21 15:12 ?2161次閱讀

    什么是芯光纖?為什么需要芯光纖?

    芯光纖(Hollow-core fiber)—— 一種新型傳輸媒介 。
    的頭像 發(fā)表于 12-27 09:22 ?1229次閱讀

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學(xué)習(xí)
    • 獲取您個性化的科技前沿技術(shù)信息
    • 參加活動獲取豐厚的禮品