<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

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

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

接口

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

空接口的定義方式:

1

2

type empty_int interface {

}

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

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

1

2

// 聲明一個空接口實例

var i interface{}

再比如函數使用空接口類型參數

func myfunc(i interface{})

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

1

2

$ go doc fmt Println

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

空接口數據結構

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

例如,創建一個空接口的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)

}

}

輸出結果:

1

2

3

4

5

11

hello world

[11 22 33 44]

《nil》

《nil》

顯然,通過空接口類型,Go也能像其它動態語言一樣,在數據結構中存儲任意類型的數據。

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

1

2

3

4

type my_struct struct {

anything interface{}

anythings []interface{}

}

拷貝數據結構到空接口數據結構

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

1

2

3

var any interface{}

any = “hello world”

any = 11

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

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

Golang給的一個經典的示例:將某個slice中的數據拷貝到空接口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的空接口slice來說,它的每個元素都是以2機器字長為單元的連續空間,共占用N*2個機器字長的空間。

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

這些對象的內存布局在編譯期間就已經確定好了,所以沒法直接將不同內存布局的數據結構進行拷貝。

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

1

2

3

4

var any []interface{}

for _,value := range testSlice{

any = append(any,value)

}

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

不僅空接口的Slice如此,其它包含空接口的數據結構,也都類似。

審核編輯:黃飛

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    7890

    瀏覽量

    149095
  • 數據類型
    +關注

    關注

    0

    文章

    229

    瀏覽量

    13535

原文標題:空接口

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

收藏 人收藏

    評論

    相關推薦

    LVDS接口液晶屏定義(lcd)

    LVDS接口液晶屏定義20PIN單6定義:1:電源2:電源3:地 4:地 5:R0- 6:R0+ 7:地 8:R1- 9:R1+ 10:地 11:R2- 12:R2+ 13:地 14:CLK- 15
    發表于 07-01 13:54

    液晶屏輸入接口定義

    20PIN單6定義:3.3V3.3V 1:電源2:電源3:地4:地5:R0-6:R0+ 7:地8:R1-9:R1+10:地11:R2-12:R2+13:地14:CLK-15:CLK+ 16 17
    發表于 06-09 22:29

    顯示器接口定義

    20PIN單6定義:3.3V3.3V 1:電源2:電源3:地4:地5:R0-6:R0+ 7:地8:R1-9:R1+10:地11:R2-12:R2+13:地14:CLK-15:CLK+ 16 17
    發表于 07-07 09:19

    labview如何調用dll中函數原型為的api函數

    在使用“互連接口”--“庫與可執行程序”中,如圖所示,想調用api, 顯示GetSystemInfo函數原型的參數和返回值都是。那么我該如何使用該函數,才能正確得到系統信息呢?
    發表于 03-20 18:00

    帶LCD的PIC接口示例代碼

    來編碼LCD。我在尋找示例代碼,在那里我可以編寫簡單的“Hello World”。 以上來自于百度翻譯 以下為原文 I am trying to Interface http
    發表于 10-23 15:54

    消息郵箱發送消息和非消息產生一樣的效果

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

    是否有一種方法來確定GPIF接口在等待GPIF主機的數據時干還是

    我用GPIF作為一個32位奴隸FIFO與2位尋址。我想知道是否有一種方法來確定GPIF接口在等待GPIF主機的數據時“干”還是。 以上來自于百度翻譯 以下為原文I am using
    發表于 05-27 14:25

    SPIXBUF為

    SPIXBUF為這個線程是SPI2BUFL問題。單片機是PIC24FJ256GA606。接收狀態(SPIRBF)被改變“1”(SPIxRXB已滿)。之后,SPI2BUFL總是0x00。SDO和SDI都輸出波形。此操作僅是SPI2。SPI1操作正常。代碼
    發表于 03-20 07:31

    自制芯電感相關資料分享

    業余設計制作中,常遇到自制芯電感。一般芯電感匝數在30匝以下,尤其是幾匝的芯電感,用一般的L表測量誤差大,甚至無法讀數。我在這里給大家介紹一種簡易計算公式和制作方法。 計算公式:N=0.4(l/d)開次方。
    發表于 05-06 11:45

    #define NOP() _nop_() /* 定義指令 */這個指令怎么用的???

    #defineNOP() _nop_()/* 定義指令 */ 這個指令怎么用的???
    發表于 06-19 07:47

    ESAM接口函數源代碼

    ESAM接口函數源代碼 ESAM接口函數說是用子程序的代碼
    發表于 08-18 16:51 ?65次下載

    API-Shop-OCR-營業執照識別API接口Python調用示例代碼說明

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

    圖形引擎服務場景化接口示例代碼

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

    華為音頻服務示例代碼及各接口的使用示例

    簡介 本示例代碼封裝華為音頻服務(HUAWEI Audio Kit)安卓接口,提供多個樣例項目供您參考。其中包含以下類: HwAudioPlayerManager: 音頻播放管理類(包括播放、暫停
    發表于 04-06 10:40 ?3次下載

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

    MPC82系列MCU的SPI(串行外圍接口)示例代碼
    發表于 06-30 17:35 ?0次下載
    MPC82系列MCU的SPI(串行外圍<b class='flag-5'>接口</b>)<b class='flag-5'>示例</b><b class='flag-5'>代碼</b>
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>