go語(yǔ)法入門(mén)any類(lèi)型的使用場(chǎng)景示例詳解
一、介紹
在沒(méi)有any類(lèi)型之前,go語(yǔ)言中,我們經(jīng)常使用interface{},來(lái)表示一個(gè)類(lèi)型是未知的,或者有好幾種其他基礎(chǔ)類(lèi)型的情況。
從 Go1.18開(kāi)始,go官方定義了一個(gè)預(yù)聲明標(biāo)識(shí)符(Predeclared identifiers):any。
// any is an alias for interface{} and is equivalent to interface{} in all ways. // any 是一個(gè) interface{}的 別名,并且在任何情況下和interface{}相同。 type any = interface{}
官方的定義,告訴了我們any就是interface{}的別名,用來(lái)代替interface{}的。
go源碼中現(xiàn)在也大量的使用any比如:
func Print(a ...any) (n int, err error) func Println(a ...any) (n int, err error) type Pointer[T any] struct var expunged = new(any) dirty map[any]*entry func Marshal(v any) ([]byte, error) ......
太多地方用到了,基本上go官方,用any代替了任何interface{}出現(xiàn)的地方。
二、any的最佳實(shí)踐
2.1 在map的情況下,map更適合做key
我們先來(lái)看一個(gè)下面兩個(gè)時(shí)間,大家比較一下,哪一個(gè)比較好。
func TestAny(t *testing.T) { m1 := make(map[any]string, 0) m1["1"] = "1" m1[2] = "2" var v1 string = m1["1"] var v2 string = m1[2] t.Log(v1, v2) m2 := make(map[string]any, 0) m2["1"] = "1" m2["2"] = 2 var v3 string = m2["1"].(string) var v4 int = m2["2"].(int) t.Log(v3, v4) }
結(jié)論是 m1這種方式好。為什么,因?yàn)橛米鰇ey的話,這樣我們無(wú)論做為保存,還是讀取,都無(wú)需多做什么操作。
m2這種方式,我們需要拿到數(shù)據(jù)后,進(jìn)行類(lèi)型的轉(zhuǎn)換。這一步還的和之前保存的一樣,就很復(fù)雜。
2.2 函數(shù)的參數(shù)和返回值,any更適合做參數(shù)
在官方的json解析包里面。無(wú)論是編碼還是解碼,any都只是作為參數(shù)。
func Marshal(v any) ([]byte, error) func Unmarshal(data []byte, v any) error
如果是返回值的話,我們調(diào)用這個(gè)函數(shù),還得進(jìn)行返回值的類(lèi)型轉(zhuǎn)換,這對(duì)于調(diào)用方,無(wú)疑是巨大負(fù)擔(dān)。
但作為參數(shù),對(duì)于調(diào)用方,是巨大的便利,他可以傳入各種類(lèi)型。
以上就是go語(yǔ)法入門(mén)any類(lèi)型的使用場(chǎng)景示例詳解的詳細(xì)內(nèi)容,更多關(guān)于go語(yǔ)法入門(mén)any類(lèi)型使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go語(yǔ)言集成開(kāi)發(fā)環(huán)境之VS Code安裝使用
VS Code是微軟開(kāi)源的一款編輯器,插件系統(tǒng)十分的豐富,下面介紹如何用VS Code搭建go語(yǔ)言開(kāi)發(fā)環(huán)境,需要的朋友可以參考下2021-10-10golang時(shí)間字符串和時(shí)間戳轉(zhuǎn)換的案例
這篇文章主要介紹了golang時(shí)間字符串和時(shí)間戳轉(zhuǎn)換的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12Golang?統(tǒng)計(jì)字符串中數(shù)字字母數(shù)量的實(shí)現(xiàn)方法
這篇文章主要介紹了Golang?統(tǒng)計(jì)字符串中數(shù)字字母數(shù)量,本文給出了兩種從字符串獲取數(shù)字與字母數(shù)量的方法,分別是ASCII 碼值和正則表達(dá)式,需要的朋友可以參考下2022-06-06Golang程序中使用Prometheus的client_golang庫(kù)
這篇文章主要介紹了Golang程序中使用Prometheus的client_golang庫(kù),Prometheus 是一個(gè)開(kāi)源的監(jiān)控和警報(bào)工具包,用于收集和處理應(yīng)用程序和系統(tǒng)的指標(biāo)數(shù)據(jù)。Prometheus 提供了多種客戶端庫(kù),可以輕松地集成到各種編程語(yǔ)言中2023-04-04詳解如何在golang鏡像中設(shè)置指定時(shí)區(qū)
這篇文章主要為大家詳細(xì)介紹了如何在golang鏡像中設(shè)置指定時(shí)區(qū),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的可以了解一下2023-04-04Go Web后臺(tái)管理系統(tǒng)項(xiàng)目實(shí)現(xiàn)
本文主要介紹了Go Web后臺(tái)管理系統(tǒng)項(xiàng)目實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-05-05golang實(shí)現(xiàn)協(xié)程池的方法示例
本文主要介紹了golang實(shí)現(xiàn)協(xié)程池的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02