衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

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

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

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

馬哥Linux運(yùn)維 ? 來(lái)源:cnblogs ? 2024-04-30 12:59 ? 次閱讀

接口

空接口是指沒(méi)有定義任何接口方法的接口。沒(méi)有定義任何接口方法,意味著Go中的任意對(duì)象都可以實(shí)現(xiàn)空接口(因?yàn)闆](méi)方法需要實(shí)現(xiàn)),任意對(duì)象都可以保存到空接口實(shí)例變量中。

空接口的定義方式:

1

2

type empty_int interface {

}

通常會(huì)簡(jiǎn)寫(xiě)為type empty_int interface{}。

更常見(jiàn)的,會(huì)直接使用interface{}作為一種類型,表示空接口。例如:

1

2

// 聲明一個(gè)空接口實(shí)例

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)

可以定義一個(gè)空接口類型的array、slice、map、struct等,這樣它們就可以用來(lái)存放任意類型的對(duì)象,因?yàn)槿我忸愋投紝?shí)現(xiàn)了空接口。

例如,創(chuàng)建一個(gè)空接口的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》

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

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

1

2

3

4

type my_struct struct {

anything interface{}

anythings []interface{}

}

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

前面解釋了任意類型的對(duì)象都能賦值給空接口實(shí)例。

1

2

3

var any interface{}

any = “hello world”

any = 11

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

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

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

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)

}

這是因?yàn)槊總€(gè)空接口的內(nèi)存布局都占用兩個(gè)機(jī)器字長(zhǎng)的內(nèi)容。對(duì)于長(zhǎng)度為N的空接口slice來(lái)說(shuō),它的每個(gè)元素都是以2機(jī)器字長(zhǎng)為單元的連續(xù)空間,共占用N*2個(gè)機(jī)器字長(zhǎng)的空間。

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

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

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

1

2

3

4

var any []interface{}

for _,value := range testSlice{

any = append(any,value)

}

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

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

審核編輯:黃飛

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

    關(guān)注

    33

    文章

    8691

    瀏覽量

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

    關(guān)注

    0

    文章

    236

    瀏覽量

    13662

原文標(biāo)題:空接口

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    時(shí)碼.ppt

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

    助聽(tīng)器鋅電池

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

    電池問(wèn)答

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

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

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

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

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

    STM32F091片使用System Bootloader下載

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

    STM32F091片編程后怎樣直接運(yùn)行用戶代碼

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

    基于預(yù)器跳閘后的處理

    預(yù)器是鍋爐的重要輔機(jī),機(jī)組運(yùn)行中一臺(tái)預(yù)器跳閘若未及時(shí)處理或處理不當(dāng),可能會(huì)造成鍋爐MFT或空氣預(yù)熱器變形卡澀等,對(duì)機(jī)組安全運(yùn)行形成巨大威脅。預(yù)器入口煙氣溫度高極易引起預(yù)器膨脹不
    發(fā)表于 02-05 14:28 ?0次下載

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

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

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

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

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

    簡(jiǎn)介 圖形引擎服務(wù)場(chǎng)景化接口示例代碼演示了如何調(diào)用SceneView、ARView和FaceView進(jìn)行圖形渲染。 開(kāi)發(fā)準(zhǔn)備 1.檢查Android Studio開(kāi)發(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。然后,可以使用一個(gè)for循環(huán)來(lái)逐行創(chuàng)建一個(gè)的一維列表,并使用另一個(gè)for循環(huán)來(lái)向的二維列表中添加這些一維列表。 下面是一個(gè)示例代碼,創(chuàng)建一個(gè)3行4列
    的頭像 發(fā)表于 11-21 15:12 ?1865次閱讀

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

    芯光纖(Hollow-core fiber)—— 一種新型傳輸媒介 。
    的頭像 發(fā)表于 12-27 09:22 ?1036次閱讀
    二八杠棋牌| 玩百家乐官网新澳门娱乐城| 大发888在线下载| 赌百家乐可以赢钱| 百家乐玩法教材| 百家乐官网看| 百家乐官网返水1.2不限| 百家乐官网赌场作弊| 皇冠代理| 和记娱乐| 莆田棋牌游戏中心| 皇冠现金网址| 大发888怎么下载安装| 大发888官方免费下载| 百家乐游戏网上投注| 伯爵百家乐娱乐场| 免费玩百家乐的玩法技巧和规则| 百家乐注册送彩金平台| 百家乐资金注码| 澳门百家乐怎样下注| 百家乐二游戏机| 百家乐官| 威尼斯人娱乐城线路lm0| 大发888客服电话 在线| 百家乐官网小九梭哈| 百家乐官网技巧网址| 百家乐路单用处| 公海百家乐官网的玩法技巧和规则| 皇家百家乐官网的玩法技巧和规则| 百家乐官网怎么玩| 开心8百家乐现金网| 百家乐AG| 大发888游戏代充值| 瑞博网站| 百家乐官网是如何出千的| 二代百家乐官网破解| 百家乐官网有试玩的吗| 新葡京百家乐娱乐城| 威尼斯人娱乐城网址| 博亿线上娱乐城| 百家乐官网百家乐官网伴侣|