Golang interface{}的具體使用
一、什么是 interface{}?
在 Go 語(yǔ)言中,interface{} 是一種空接口(empty interface),它表示任意類(lèi)型。因?yàn)樗鼪](méi)有定義任何方法,所以 所有類(lèi)型都實(shí)現(xiàn)了它。
定義形式:
interface{}等價(jià)于:
type interface{} interface {}二、interface{} 有什么特別的?
? 特點(diǎn):
所有類(lèi)型都實(shí)現(xiàn)了
interface{}。可以用來(lái)存儲(chǔ)任意類(lèi)型的值。
是 Go 的萬(wàn)能類(lèi)型容器,類(lèi)似于其他語(yǔ)言里的
Object或any。
三、使用示例
1. 存儲(chǔ)任意類(lèi)型的值:
func printAnything(v interface{}) {
fmt.Println("值是:", v)
}
?
func main() {
printAnything(123)
printAnything("hello")
printAnything([]int{1, 2, 3})
}輸出:
值是:123
值是:hello
值是:[1 2 3]
四、底層原理:interface{} 是怎么存值的?
Go 編譯器將 interface{} 實(shí)際存儲(chǔ)為兩部分:
type eface struct {
_type *_type // 真實(shí)類(lèi)型信息
data unsafe.Pointer // 指向?qū)嶋H數(shù)據(jù)的指針
}比如:
var a interface{} = 123這時(shí)候:
_type:指向int的類(lèi)型描述符;data:指向 123 這個(gè) int 的值。
五、怎么取出 interface{} 中的值?
1. 類(lèi)型斷言(Type Assertion):
var a interface{} = "hello"
?
str, ok := a.(string)
if ok {
fmt.Println("轉(zhuǎn)換成功:", str)
} else {
fmt.Println("轉(zhuǎn)換失敗")
}2. 使用類(lèi)型分支(Type Switch):
var a interface{} = 3.14
?
switch v := a.(type) {
case int:
fmt.Println("是 int:", v)
case float64:
fmt.Println("是 float64:", v)
case string:
fmt.Println("是 string:", v)
default:
fmt.Println("未知類(lèi)型")
}六、常見(jiàn)使用場(chǎng)景
| 場(chǎng)景 | 描述 |
|---|---|
| JSON 解析 | map[string]interface{} 可以存儲(chǔ)任意結(jié)構(gòu) |
| fmt.Println | 接收的是 ...interface{} 參數(shù) |
| 任意類(lèi)型傳參 | 寫(xiě)通用工具函數(shù),允許接收任意類(lèi)型 |
| 空值或未知類(lèi)型變量 | 當(dāng)不知道變量類(lèi)型時(shí),先存為 interface{} |
七、注意事項(xiàng)
interface{}存進(jìn)去什么類(lèi)型,取出來(lái)的時(shí)候必須斷言正確,否則運(yùn)行時(shí)報(bào)錯(cuò)。interface{}本身不能直接做加減乘除等運(yùn)算,必須先類(lèi)型斷言。不等于 JavaScript 的
any,Go 仍然是強(qiáng)類(lèi)型語(yǔ)言,類(lèi)型斷言很重要。interface{}不能直接比較,除非內(nèi)部類(lèi)型支持==。
八、面試??紗?wèn)答
Q:interface{} 是不是萬(wàn)能的?
A:它可以存儲(chǔ)任何類(lèi)型的值,但你不能隨便操作這些值,除非你知道它的真實(shí)類(lèi)型,并且使用類(lèi)型斷言來(lái)還原它。
Q:interface{} 和 interface 的區(qū)別?
A:interface{} 是一種接口類(lèi)型,沒(méi)有定義任何方法;而普通的接口比如 Writer interface { Write(p []byte) (n int, err error) } 定義了方法,只有實(shí)現(xiàn)這些方法的類(lèi)型才能賦值給該接口。
九、總結(jié)一句話:
interface{} 是 Go 中可以表示任意類(lèi)型的“空接口”,是實(shí)現(xiàn)泛型編程的基礎(chǔ)工具之一。
到此這篇關(guān)于Golang interface{}的具體使用的文章就介紹到這了,更多相關(guān)Golang interface{}內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于Go語(yǔ)言中特有的設(shè)計(jì)模式與實(shí)現(xiàn)方式講解
雖然Go語(yǔ)言沒(méi)有像其他語(yǔ)言那樣明確的設(shè)計(jì)模式,但在實(shí)踐中,開(kāi)發(fā)者們?nèi)匀话l(fā)現(xiàn)了一些在Go語(yǔ)言中特別適用的設(shè)計(jì)模式和實(shí)現(xiàn)方式,本文就來(lái)和大家一一進(jìn)行講解2023-05-05
以go為例探究beyla從環(huán)境變量BEYLA_OPEN_PORT發(fā)現(xiàn)進(jìn)程原理
這篇文章主要為大家介紹了以golang進(jìn)程為例,研究beyla從環(huán)境變量BEYLA_OPEN_PORT(即通過(guò)端口)發(fā)現(xiàn)進(jìn)程的原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
GO語(yǔ)言入門(mén)學(xué)習(xí)之基本數(shù)據(jù)類(lèi)型字符串
字符串在Go語(yǔ)言中以原生數(shù)據(jù)類(lèi)型出現(xiàn),使用字符串就像使用其他原生數(shù)據(jù)類(lèi)型(int、bool、float32、float64 等)一樣,下面這篇文章主要給大家介紹了關(guān)于GO語(yǔ)言入門(mén)學(xué)習(xí)之基本數(shù)據(jù)類(lèi)型字符串的相關(guān)資料,需要的朋友可以參考下2022-04-04
go語(yǔ)言通過(guò)反射獲取和設(shè)置結(jié)構(gòu)體字段值的方法
這篇文章主要介紹了go語(yǔ)言通過(guò)反射獲取和設(shè)置結(jié)構(gòu)體字段值的方法,實(shí)例分析了Go語(yǔ)言反射的使用技巧,需要的朋友可以參考下2015-03-03
Go語(yǔ)言基于Goroutine的超時(shí)控制方案設(shè)計(jì)與實(shí)踐
Go語(yǔ)言因其并發(fā)特性而備受青睞,尤其是goroutine和channel的組合,像一對(duì)默契的搭檔,為開(kāi)發(fā)者提供了輕量、高效的并發(fā)工具,下面我們來(lái)看看基于goroutine的超時(shí)控制方案吧2025-05-05
手把手帶你走進(jìn)Go語(yǔ)言之條件表達(dá)式
條件表達(dá)式由條件運(yùn)算符構(gòu)成,并常用條件表達(dá)式構(gòu)成一個(gè)賦值語(yǔ)句,本文給大家介紹了在Go語(yǔ)言中條件表達(dá)式的具體用法,講述的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值2021-09-09
我放棄Python轉(zhuǎn)Go語(yǔ)言的9大理由(附優(yōu)秀書(shū)籍推薦)
這篇文章主要給大家介紹了關(guān)于我放棄Python轉(zhuǎn)Go語(yǔ)言的9大理由,以及給大家推薦了6本優(yōu)秀的go語(yǔ)言書(shū)籍,對(duì)同樣想學(xué)習(xí)golang的朋友們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10
golang中sync.Mutex的實(shí)現(xiàn)方法
本文主要介紹了golang中sync.Mutex的實(shí)現(xiàn)方法,mutex?主要有兩個(gè)?method:?Lock()?和?Unlock(),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04

