go語法入門any類型的使用場(chǎng)景示例詳解
一、介紹
在沒有any類型之前,go語言中,我們經(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語法入門any類型的使用場(chǎng)景示例詳解的詳細(xì)內(nèi)容,更多關(guān)于go語法入門any類型使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Linux環(huán)境下編譯并運(yùn)行g(shù)o項(xiàng)目的全過程
Go語言是Google的開源編程語言,廣泛應(yīng)用于云計(jì)算、分布式系統(tǒng)開發(fā)等領(lǐng)域,在Linux上也有大量的應(yīng)用場(chǎng)景,這篇文章主要給大家介紹了關(guān)于Linux環(huán)境下編譯并運(yùn)行g(shù)o項(xiàng)目的相關(guān)資料,需要的朋友可以參考下2023-11-11
Golang的循環(huán)中break和continue語句的用法講解
這篇文章主要介紹了Golang的循環(huán)中break和continue語句的用法講解,是Go語言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-10-10
golang 對(duì)私有函數(shù)進(jìn)行單元測(cè)試的實(shí)例
這篇文章主要介紹了golang 對(duì)私有函數(shù)進(jìn)行單元測(cè)試的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-05-05
go語言使用第三方包 json化結(jié)構(gòu)體操作示例
這篇文章主要介紹了go語言使用第三方包 json化結(jié)構(gòu)體操作,結(jié)合實(shí)例形式分析了Go語言ffjson包git安裝及結(jié)構(gòu)體轉(zhuǎn)json字符串相關(guān)操作技巧,需要的朋友可以參考下2019-06-06
使用Go語言實(shí)現(xiàn)HTTP客戶端請(qǐng)求并解析響應(yīng)的完整流程
在日常開發(fā)中,無論是調(diào)用 RESTful API、采集網(wǎng)頁(yè)數(shù)據(jù),還是進(jìn)行微服務(wù)之間的通信,HTTP 客戶端幾乎無處不在,本文聚焦于如何使用 Go 實(shí)現(xiàn)一個(gè) HTTP 客戶端,完成請(qǐng)求發(fā)送、響應(yīng)解析、錯(cuò)誤處理、Header與Body提取等完整流程,需要的朋友可以參考下2025-08-08
Linux系統(tǒng)下Go語言開發(fā)環(huán)境搭建
這篇文章主要介紹了Linux系統(tǒng)下Go開發(fā)環(huán)境搭建,需要的朋友可以參考下2022-04-04
Go切片導(dǎo)致rand.Shuffle產(chǎn)生重復(fù)數(shù)據(jù)的原因與解決方案
在 Go 語言的實(shí)際開發(fā)中,切片(slice)是一種非常靈活的數(shù)據(jù)結(jié)構(gòu),然而,由于其底層數(shù)據(jù)共享的特性,在某些情況下可能會(huì)導(dǎo)致意想不到的 Bug,本文將詳細(xì)分析 rand.Shuffle 之后,切片中的數(shù)據(jù)出現(xiàn)重復(fù)的問題,探討其根本原因,并給出最佳解決方案,需要的朋友可以參考下2025-02-02

