go語(yǔ)法入門any類型的使用場(chǎng)景示例詳解
一、介紹
在沒有any類型之前,go語(yǔ)言中,我們經(jīng)常使用interface{},來表示一個(gè)類型是未知的,或者有好幾種其他基礎(chǔ)類型的情況。
從 Go1.18開始,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{}的別名,用來代替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
我們先來看一個(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的話,這樣我們無論做為保存,還是讀取,都無需多做什么操作。
m2這種方式,我們需要拿到數(shù)據(jù)后,進(jìn)行類型的轉(zhuǎn)換。這一步還的和之前保存的一樣,就很復(fù)雜。
2.2 函數(shù)的參數(shù)和返回值,any更適合做參數(shù)
在官方的json解析包里面。無論是編碼還是解碼,any都只是作為參數(shù)。
func Marshal(v any) ([]byte, error) func Unmarshal(data []byte, v any) error
如果是返回值的話,我們調(diào)用這個(gè)函數(shù),還得進(jìn)行返回值的類型轉(zhuǎn)換,這對(duì)于調(diào)用方,無疑是巨大負(fù)擔(dān)。
但作為參數(shù),對(duì)于調(diào)用方,是巨大的便利,他可以傳入各種類型。
以上就是go語(yǔ)法入門any類型的使用場(chǎng)景示例詳解的詳細(xì)內(nèi)容,更多關(guān)于go語(yǔ)法入門any類型使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 執(zhí)行g(shù)o?build報(bào)錯(cuò)go:?go.mod?file?not?found?in?current?directory?or?any?parent?directory
- Go中的關(guān)鍵字any interface是否會(huì)成為歷史
- Go語(yǔ)言常見錯(cuò)誤之將接口定義在實(shí)現(xiàn)方
- Go語(yǔ)言常見錯(cuò)誤之誤用init函數(shù)實(shí)例解析
- Go語(yǔ)言常見錯(cuò)誤接口污染解決分析
- Go語(yǔ)言常見錯(cuò)誤之濫用getters/setters誤區(qū)實(shí)例探究
- Go語(yǔ)言常見錯(cuò)誤之a(chǎn)ny沒傳遞任何信息解決分析
相關(guān)文章
Go語(yǔ)言大揭秘:適用于哪些類型的項(xiàng)目開發(fā)?
想知道Go編程語(yǔ)言適合開發(fā)哪些類型的項(xiàng)目嗎?無論是網(wǎng)絡(luò)服務(wù)、分布式系統(tǒng)還是嵌入式設(shè)備,Go都能輕松應(yīng)對(duì),本文將帶你了解Go在各種場(chǎng)景下的應(yīng)用,讓你更好地選擇和使用Go進(jìn)行開發(fā),需要的朋友可以參考下2024-01-01Go使用Google?Gemini?Pro?API創(chuàng)建簡(jiǎn)單聊天機(jī)器人
這篇文章主要為大家介紹了Go使用Google?Gemini?Pro?API創(chuàng)建簡(jiǎn)單聊天機(jī)器人實(shí)現(xiàn)過程詳解,本文將通過最新的gemini?go?sdk來實(shí)現(xiàn)命令行聊天機(jī)器人2023-12-12深入剖析Go語(yǔ)言中數(shù)組和切片的區(qū)別
本文將深入探討 Go 語(yǔ)言數(shù)組和切片的區(qū)別,包括它們的定義、內(nèi)存布局、長(zhǎng)度和容量、初始化和操作等方面。從而更好地在實(shí)際開發(fā)中選擇和使用合適的數(shù)據(jù)結(jié)構(gòu),提高代碼的效率和可維護(hù)性,需要的可以參考一下2023-05-05在Go中實(shí)現(xiàn)高效可靠的鏈路追蹤系統(tǒng)
在當(dāng)今互聯(lián)網(wǎng)應(yīng)用的架構(gòu)中,分布式系統(tǒng)已經(jīng)成為主流,分布式系統(tǒng)的優(yōu)勢(shì)在于能夠提供高可用性、高并發(fā)性和可擴(kuò)展性,本文將介紹鏈路追蹤的概念和原理,并重點(diǎn)介紹如何在Golang中實(shí)現(xiàn)高效可靠的鏈路追蹤系統(tǒng),需要的朋友可以參考下2023-10-10