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