日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

Go中的關(guān)鍵字any?interface是否會成為歷史_Golang

作者:煎魚eddycjy ? 更新時間: 2022-09-13 編程語言

引言

大家在看 Go1.18 泛型的代碼時,不知道是否有留意到一個新的關(guān)鍵字 any。

示例

func Print[T any](s []T) {}

之前沒有專門提過,但有沒有小伙伴以為這個關(guān)鍵字,是泛型代碼專屬的?

其實不是...在這次新的 Go1.18 更新中,any 是作為一個新的關(guān)鍵字出現(xiàn),any 有一個真身,本質(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("煎魚好!")
}

從使用層面來講,新的關(guān)鍵字 any 會比 interface{} 方便不少,畢竟少打了好多個詞,更快了,其實也是參照現(xiàn)有 rune 類型的做法。

增加新關(guān)鍵字后的對比

長聲明 短聲明
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

我們在了解他的便利性后,再從代碼一致性和可讀性來講,是有些問題的,會造成一定的疑惑。

因此前兩天有人提出了《all: rewrite interface{} to any》的需求,打算把內(nèi)部所有的代碼都重寫一遍。

你可能會以為是人肉手工改?那肯定不是,Go 官方發(fā)起了 CL 進(jìn)行批量修改。

我們在日常的工程中,也可以和他們一樣,直接借用 Go 工具鏈來實現(xiàn)替換。

如下:

gofmt -w -r 'interface{} -> any' ./...

聽到這個消息時,我的朋友咸魚就大驚了,在想 interface{} 會不會成為歷史,被新的關(guān)鍵字 any 完全替代?

顯然,答案是不會的。因為 Go1 有兼容性的保證,肯定不會在現(xiàn)階段刪除。不過后續(xù)會出現(xiàn)一個現(xiàn)象,就是我們的 Go 工程中,有人用 any,有人用 interface{},會在代碼可讀性上比較傷人。

不過我們也可以學(xué) Go 官方,在 linter 流程中借助 gofmt 工具來強(qiáng)行把所有 interface{} 都替換成 any 來實現(xiàn)代碼的一致性。

原文鏈接:https://juejin.cn/post/7044752798784684063

欄目分類
最近更新