Go 新關鍵字 any,interface{} 會成為歷史嗎?

煎魚發表於2021-12-28

大家好,我是煎魚。

大家在看 Go1.18 泛型的程式碼時,不知道是否有留意到一個新的關鍵字 any。

例子如下:

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

之前沒有專門提過,但有沒有小夥伴以為這個關鍵字,是泛型程式碼專屬的?

其實不是...在這次新的 Go1.18 更新中,any 是作為一個新的關鍵字出現,any 有一個真身,本質上是 interface{} 的別名

type any = interface{}

也就是,在常規程式碼中,也可以直接使用:

func f(a any) {
    switch a.(type) {
    case int:
        fmt.Println("進腦子煎魚了")
    case float64:
        fmt.Println("煎魚進腦子了")
    case string:
        fmt.Println("腦子進煎魚了")
    }
}

func main() {
    f(2)
    f(3.1415)
    f("煎魚好!")
}

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

增加新關鍵字後的對比如下:

長宣告短宣告
func fT interface{} []Tfunc fT any []T
func f(a interface{})func f(a any)
var a interface{}var a any

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

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

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

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

如下:

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

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

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

不過我們也可以學 Go 官方,在 linter 流程中藉助 gofmt 工具來強行把所有 interface{} 都替換成 any 來實現程式碼的一致性。

這次變更,感覺是個美學的問題,你對此怎麼看呢?有沒有也希望哪些東西有別名,歡迎大家在評論區留言和交流:)

若有任何疑問歡迎評論區反饋和交流,最好的關係是互相成就,各位的點贊就是煎魚創作的最大動力,感謝支援。

文章持續更新,可以微信搜【腦子進煎魚了】閱讀,本文 GitHub github.com/eddycjy/blog 已收錄,學習 Go 語言可以看 Go 學習地圖和路線,歡迎 Star 催更。

相關文章