最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go中空接口的具體使用

 更新時間:2025年04月01日 10:49:42   作者:6<7  
空接口是一種特殊的接口類型,它不包含任何方法,本文主要介紹了go中空接口的具體使用,具有一定的參考價值,感興趣的可以了解一下

接口-空接口

1. 什么是空接口?

空接口是特殊形式的接口類型,普通的接口都有方法,而空接口沒有定義任何方法口,也因此,我們可以說所有類型都至少實現(xiàn)了空接口。

type empty_iface interface {
}

每一個接口都包含兩個屬性,一個是值,一個是類型。

而對于空接口來說,這兩者都是 nil,可以使用 fmt 來驗證一下

package main

import "fmt"

type empty_interface interface{
}

func main() {
	var e empty_interface
	fmt.Println(e)
	fmt.Printf("type: %T, value: %v", e, e)
}T, value: %v", i, i)
}

輸出如下

<nil>
type: <nil>, value: <nil>

2. 如何使用空接口?

第一,

通常我們會直接使用 interface{} 作為類型聲明一個實例,而這個實例可以承載任意類型的值。

package main

import (
    "fmt"
)

func main()  {
    // 聲明一個空接口實例
    var i interface{}

    // 存 int 沒有問題
    i = 1
    fmt.Printf("type: %T, value: %v\n", i, i)

    // 存字符串也沒有問題
    i = "hello"
    fmt.Printf("type: %T, value: %v\n", i, i)

    // 存布爾值也沒有問題
    i = false
    fmt.Printf("type: %T, value: %v\n", i, i)
}

輸出結(jié)果:

type: int, value: 1
type: string, value: hello
type: bool, value: false

第二,

如果想讓你的函數(shù)可以接收任意類型的值 ,也可以使用空接口

接收一個任意類型的值 示例

package main

import (
    "fmt"
)

func myfunc(iface interface{}){
    fmt.Println(iface)
}

func main()  {
    a := 10
    b := "hello"
    c := true

    myfunc(a)
    myfunc(b)
    myfunc(c)
}

輸出結(jié)果:

type: int, value: 10
type: string, value: hello
type: bool, value: true

接收任意個任意類型的值 示例

package main

import (
    "fmt"
)

func myfunc(ifaces ...interface{}){
    for _,iface := range ifaces{
        fmt.Printf("type: %T, value: %v\n", iface, iface)
    }
}

func main()  {
    a := 10
    b := "hello"
    c := true

    myfunc(a, b, c)
}

輸出結(jié)果:

type: int, value: 10
type: string, value: hello
type: bool, value: true

第三,

你也定義一個可以接收任意類型的 array、slice、map、strcut,例如這邊定義一個切片

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 i, value := range any {
        fmt.Printf("arr[%d]:\nType: %T, Value: %v\n", i,value, value)
    }
}

輸出結(jié)果:

arr[0]:
Type: int, Value: 11
arr[1]:
Type: string, Value: hello world
arr[2]:
Type: []int, Value: [11 22 33 44]
arr[3]:
Type: <nil>, Value: <nil>
arr[4]:
Type: <nil>, Value: <nil>

3. 空接口幾個要注意的坑

坑1:

空接口可以承載任意值,但不代表任意類型就可以承接空接口類型的值

從實現(xiàn)的角度看,任何類型的值都滿足空接口。因此空接口類型可以保存任何值,也可以從空接口中取出原值。

但要是你把一個空接口類型的對象,再賦值給一個固定類型(比如 int, string等類型)的對象賦值,是會報錯的。

package main

func main() {
    // 聲明a變量, 類型int, 初始值為1
    var a int = 1

    // 聲明i變量, 類型為interface{}, 初始值為a, 此時i的值變?yōu)?
    var i interface{} = a

    // 聲明b變量, 嘗試賦值i
    var b int = i
}

這個報錯,它就好比可以放進(jìn)行禮箱的東西,肯定能放到集裝箱里,但是反過來,能放到集裝箱的東西就不一定能放到行禮箱了,在 Go 里就直接禁止了這種反向操作。(聲明:底層原理肯定還另有其因,但對于新手來說,這樣解釋也許會容易理解一些。)

面向?qū)ο骪空接口\demo06.go:11:17: cannot use i (variable of type interface{}) as int value in variable declaration: need type assertion

坑2:

當(dāng)空接口承載數(shù)組和切片后,該對象(就是空接口對象)無法再進(jìn)行切片

package main

import "fmt"

func main() {
    sli := []int{2, 3, 5, 7, 11, 13}
	// 空接口承載切片
    var i interface{}
    i = sli
	// 再用切片生成切片
    g := i[1:3]
    fmt.Println(g)
}

執(zhí)行會報錯。

面向?qū)ο骪空接口\demo07.go:11:10: invalid operation: cannot slice i (variable of type interface{})

坑3:

當(dāng)你使用空接口來接收任意類型的參數(shù)時,它的靜態(tài)類型是 interface{},但動態(tài)類型(是 int,string 還是其他類型)我們并不知道,因此需要使用類型斷言。

package main

import (
    "fmt"
)

func myfunc(i interface{})  {

    switch x:=i.(type) {
    case int:
        fmt.Printf("參數(shù)的值為:%v,參數(shù)的類型是 int\n",x)
    case string:
        fmt.Printf("參數(shù)的值為:%v,參數(shù)的類型是 string\n",x)
    }
}

func main() {
    a := 10
    b := "hello"
    myfunc(a)
    myfunc(b)
}

輸出如下

參數(shù)的值為:10,參數(shù)的類型是 int
參數(shù)的值為:hello,參數(shù)的類型是 string

到此這篇關(guān)于go中空接口的具體使用的文章就介紹到這了,更多相關(guān)go 空接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言利用原生庫實現(xiàn)屏幕截取和實時推流功能

    Go語言利用原生庫實現(xiàn)屏幕截取和實時推流功能

    這篇文章主要為大家詳細(xì)介紹了Go語言利用原生庫實現(xiàn)一個高效的屏幕實時截圖推送服務(wù),文中的示例代碼講解詳細(xì),有需要的小伙伴可以了解下
    2025-06-06
  • Go語言中的未使用導(dǎo)入和變量的處理方法

    Go語言中的未使用導(dǎo)入和變量的處理方法

    在 Go 語言編程中,未使用的導(dǎo)入和變量是常見問題,Go 語言的設(shè)計理念強調(diào)代碼的簡潔性和可讀性,因此它強制要求所有導(dǎo)入的包和聲明的變量都必須被使用,本文將深入解讀相關(guān)內(nèi)容,并結(jié)合實際代碼示例和項目場景,幫助開發(fā)者更好地理解和處理未使用的導(dǎo)入和變量
    2025-06-06
  • Go語言panic和recover的用法實例

    Go語言panic和recover的用法實例

    panic()和recover()是Go語言中用于處理錯誤的兩個重要函數(shù),本文主要介紹了Go語言panic和recover的用法實例,panic()用于中止程序并引發(fā)panic,而recover()用于捕獲panic并恢復(fù)程序的執(zhí)行,感興趣的可以了解一下
    2024-01-01
  • Skywalking-go自動監(jiān)控增強使用探究

    Skywalking-go自動監(jiān)控增強使用探究

    這篇文章主要介紹了Skywalking-go自動監(jiān)控增強使用深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • golang使用信號量熱更新的實現(xiàn)示例

    golang使用信號量熱更新的實現(xiàn)示例

    這篇文章主要介紹了golang使用信號量熱更新的實現(xiàn)示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • Golang使用泛型對數(shù)組進(jìn)行去重的實現(xiàn)

    Golang使用泛型對數(shù)組進(jìn)行去重的實現(xiàn)

    本文主要介紹了Golang使用泛型對數(shù)組進(jìn)行去重的實現(xiàn),通過使用類型參數(shù)T和類型約束any,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • go語言程序cpu過高問題排查的方法詳解

    go語言程序cpu過高問題排查的方法詳解

    使用golang進(jìn)行復(fù)雜的組合運算,導(dǎo)致CPU占用率非常高,下面這篇文章主要給大家介紹了關(guān)于go語言程序cpu過高問題排查的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • Golang算法問題之?dāng)?shù)組按指定規(guī)則排序的方法分析

    Golang算法問題之?dāng)?shù)組按指定規(guī)則排序的方法分析

    這篇文章主要介紹了Golang算法問題之?dāng)?shù)組按指定規(guī)則排序的方法,結(jié)合實例形式分析了Go語言數(shù)組排序相關(guān)算法原理與操作技巧,需要的朋友可以參考下
    2017-02-02
  • go 代碼的調(diào)試---打印調(diào)用堆棧的實例

    go 代碼的調(diào)試---打印調(diào)用堆棧的實例

    下面小編就為大家?guī)硪黄猤o 代碼的調(diào)試---打印調(diào)用堆棧的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Go語言通過反射實現(xiàn)獲取各種類型變量的值

    Go語言通過反射實現(xiàn)獲取各種類型變量的值

    反射是程序在運行期間獲取變量的類型和值、或者執(zhí)行變量的方法的能力,這篇文章主要為大家講講Go語言通過反射獲取各種類型變量值的方法,需要的可以參考下
    2023-07-07

最新評論

罗城| 叶城县| 平罗县| 汝南县| 仙桃市| 汶川县| 东明县| 盱眙县| 清苑县| 通江县| 灵山县| 永和县| 大关县| 荥经县| 龙山县| 和龙市| 赞皇县| 安乡县| 武山县| 莲花县| 论坛| 会同县| 东丽区| 高青县| 榆中县| 伊春市| 平邑县| 库车县| 巴彦淖尔市| 开封市| 彭山县| 图木舒克市| 阳信县| 华阴市| 苏州市| 卫辉市| 古浪县| 正蓝旗| 铁岭县| 松溪县| 即墨市|