Go中的關(guān)鍵字any interface是否會(huì)成為歷史
引言
大家在看 Go1.18 泛型的代碼時(shí),不知道是否有留意到一個(gè)新的關(guān)鍵字 any。
示例
func Print[T any](s []T) {}
之前沒(méi)有專門提過(guò),但有沒(méi)有小伙伴以為這個(gè)關(guān)鍵字,是泛型代碼專屬的?
其實(shí)不是...在這次新的 Go1.18 更新中,any 是作為一個(gè)新的關(guān)鍵字出現(xiàn),any 有一個(gè)真身,本質(zhì)上是 interface{} 的別名:
type any = interface{}
也就是,在常規(guī)代碼中,也可以直接使用:
func f(a any) {
switch a.(type) {
case int:
fmt.Println("進(jìn)腦子煎魚了")
case float64:
fmt.Println("煎魚進(jìn)腦子了")
case string:
fmt.Println("腦子進(jìn)煎魚了")
}
}
func main() {
f(2)
f(3.1415)
f("煎魚好!")
}
從使用層面來(lái)講,新的關(guān)鍵字 any 會(huì)比 interface{} 方便不少,畢竟少打了好多個(gè)詞,更快了,其實(shí)也是參照現(xiàn)有 rune 類型的做法。
增加新關(guān)鍵字后的對(duì)比
| 長(zhǎng)聲明 | 短聲明 |
|---|---|
| func f[T interface{}](s []T) []T | func f[T any](s []T) []T |
| func f(a interface{}) | func f(a any) |
| var a interface{} | var a any |
我們?cè)诹私馑谋憷院螅購(gòu)拇a一致性和可讀性來(lái)講,是有些問(wèn)題的,會(huì)造成一定的疑惑。
因此前兩天有人提出了《all: rewrite interface{} to any》的需求,打算把內(nèi)部所有的代碼都重寫一遍。

你可能會(huì)以為是人肉手工改?那肯定不是,Go 官方發(fā)起了 CL 進(jìn)行批量修改。
我們?cè)谌粘5墓こ讨?,也可以和他們一樣,直接借?Go 工具鏈來(lái)實(shí)現(xiàn)替換。
如下:
gofmt -w -r 'interface{} -> any' ./...
聽(tīng)到這個(gè)消息時(shí),我的朋友咸魚就大驚了,在想 interface{} 會(huì)不會(huì)成為歷史,被新的關(guān)鍵字 any 完全替代?

顯然,答案是不會(huì)的。因?yàn)?Go1 有兼容性的保證,肯定不會(huì)在現(xiàn)階段刪除。不過(guò)后續(xù)會(huì)出現(xiàn)一個(gè)現(xiàn)象,就是我們的 Go 工程中,有人用 any,有人用 interface{},會(huì)在代碼可讀性上比較傷人。
不過(guò)我們也可以學(xué) Go 官方,在 linter 流程中借助 gofmt 工具來(lái)強(qiáng)行把所有 interface{} 都替換成 any 來(lái)實(shí)現(xiàn)代碼的一致性。
以上就是Go中的關(guān)鍵字any interface是否會(huì)成為歷史的詳細(xì)內(nèi)容,更多關(guān)于Go關(guān)鍵字any interface的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- go語(yǔ)法入門any類型的使用場(chǎng)景示例詳解
- 執(zhí)行g(shù)o?build報(bào)錯(cuò)go:?go.mod?file?not?found?in?current?directory?or?any?parent?directory
- Go語(yǔ)言常見(jiàn)錯(cuò)誤之將接口定義在實(shí)現(xiàn)方
- Go語(yǔ)言常見(jiàn)錯(cuò)誤之誤用init函數(shù)實(shí)例解析
- Go語(yǔ)言常見(jiàn)錯(cuò)誤接口污染解決分析
- Go語(yǔ)言常見(jiàn)錯(cuò)誤之濫用getters/setters誤區(qū)實(shí)例探究
- Go語(yǔ)言常見(jiàn)錯(cuò)誤之a(chǎn)ny沒(méi)傳遞任何信息解決分析
相關(guān)文章
golang協(xié)程池模擬實(shí)現(xiàn)群發(fā)郵件功能
這篇文章主要介紹了golang協(xié)程池模擬實(shí)現(xiàn)群發(fā)郵件功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05
深入理解Golang之http server的實(shí)現(xiàn)
這篇文章主要介紹了深入理解Golang之http server的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
Go語(yǔ)言編譯時(shí)為exe添加圖標(biāo)和屬性信息的方法
在使用Go語(yǔ)言開(kāi)發(fā)應(yīng)用程序時(shí),有個(gè)非常方便的地方就是編譯得到的可執(zhí)行文件可以不依賴任何動(dòng)態(tài)鏈接庫(kù)、并且不需要任何運(yùn)行環(huán)境即可運(yùn)行,本文給大家介紹Go編譯時(shí)為exe添加圖標(biāo)和屬性信息的方法,需要的朋友可以參考下2023-09-09
go的defer和閉包示例說(shuō)明(非內(nèi)部實(shí)現(xiàn))
這篇文章主要為大家介紹了go的defer和閉包示例說(shuō)明(非內(nèi)部實(shí)現(xiàn)),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
Go語(yǔ)言Gin框架前后端分離項(xiàng)目開(kāi)發(fā)實(shí)例
本文主要介紹了Go語(yǔ)言Gin框架前后端分離項(xiàng)目開(kāi)發(fā)工程化實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11
go語(yǔ)言基礎(chǔ)教程之(包、變量和函數(shù))
這篇文章主要介紹了go語(yǔ)言基礎(chǔ)教程之(包、變量和函數(shù))的相關(guān)資料,需要的朋友可以參考下2023-07-07

