Go語言為什麼沒有 Min/Max(int, int) 函數?

2019-06-02   Go語言中文網

Go中文網導讀:你在使用過程中是否有過這樣的困惑,或者你可能使用的方式就是錯誤的!

現象

我們知道Go語言math包裡面定義了min/max函數,但是是float64類型的,而並沒有整數類型的min/max。

Go語言的math包裡面定義的min/max函數簽名如下:

math.Min(float64, float64) float64
math.Max(float64, float64) float64

事實上我們更經常要比較的是兩個整數的場景:

math.Min/Max(int, int), or
math.Min/Max(int64, int64)

解釋

那麼,為什麼Go語言不提供整數類型的min/max這兩個函數呢? 下面的這篇文章給了一個解釋:

「不要亂用 math 包的 Max/Min」,連結:https://mrekucci.blogspot.jp/2015/07/dont-abuse-mathmax-mathmin.html

總結起來,主要理由是說,

  1. 由於float64類型要處理infinity和not-a-number這種值,而它們的處理非常複雜,一般用戶處理不好,所有Go需要為用戶提供系統級別的解決辦法。
  2. 對於int/int64類型的數據,min/max的實現非常簡單直接,用戶完全可以自己實現,例如:(通過使用 math.Max/Min,直接強制類型轉換可能會有問題)
func Min(x, y int64) int64 {
if x < y {
return x
}
return y
}

結論就是說Go希望用戶自己來實現如此簡單的函數。

這個時候,很多人就會有疑問:

因為min/max(int, int)的使用如此的常見,難道需要用戶在每一個自己的項目裡面都實現一份min/max的代碼嗎?為什麼不放在系統庫例如math裡面,方便所有人使用呢?

總結建議

我認為,除了以上理由,還有一個理由可能是因為 Go 語言不支持函數重載,不支持泛型,在 math 包提供不方便,也許有了 Go2 有了泛型,會有更好的解決方案。

整體上,Go語言標準庫將一些複雜的功能做了封裝,但簡單的一些功能,Go的原則還是希望用戶自己實現。所以,我覺得Go的愛好者們,應該有自己的一套常用輔助方法包,其他項目引用該包即可。