再一次看到了 Go 的節(jié)制:Int128 類(lèi)型要不要支持?
本文轉(zhuǎn)載自微信公眾號(hào)「polarisxu」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系polarisxu公眾號(hào)。
大家好,我是站長(zhǎng) polarisxu。
如果有看我寫(xiě)的 Rust 系列教程,會(huì)注意到,Rust 有一個(gè)整數(shù)類(lèi)型:i128/u128,即 16 字節(jié)長(zhǎng)的整數(shù)。而 Go 是不支持 int128/unit128 的。
當(dāng)時(shí),我也沒(méi)有多想,感覺(jué) 128 長(zhǎng)度應(yīng)該用的也少。今天,我發(fā)現(xiàn)早在 2014 年就有人提議在 Go 中增加 int128/uint128 的支持:https://github.com/golang/go/issues/9455。
為什么想要這個(gè)類(lèi)型呢?
有人提出了相關(guān)的使用場(chǎng)景,總結(jié)下大概有如下幾個(gè):
- UUID
- IPv6
- hashing (MD5)
- timestamps
- cryptographic nonces
- database keys
- 。。。
針對(duì)有人提出的一些需求點(diǎn),minux(很早期就參與 Go 開(kāi)發(fā)的,華人,go mobile 項(xiàng)目是他主導(dǎo)的)給了如下答復(fù):
大家注意到?jīng)],被人 ??。
ianlancetaylor(泛型是他在主導(dǎo)設(shè)計(jì))給出了這樣的答復(fù):
UUID 和 IP6 的例子不夠有說(shuō)服力,它們很容易用其他方式實(shí)現(xiàn)。要不要支持 int128/uint128,關(guān)鍵在于有沒(méi)有該類(lèi)型相關(guān)的算術(shù)運(yùn)算需求。在具體實(shí)現(xiàn)時(shí),硬件是否很好的支持也需要考慮。
如果增加了該類(lèi)型,strconv、math/big 等包為了兼容,需要增加額外的一些列函數(shù)。
他還回復(fù)了很多人的其他疑問(wèn),他一直強(qiáng)調(diào)幾點(diǎn):
- 你為什么需要 int128/uint128?
- 是否有做運(yùn)算的需要?
- 對(duì)語(yǔ)言可能有破壞,因此這個(gè)提案標(biāo)記為 「Go2」
其中他的一句話(huà)不少人可能要吐槽:
- Go is not a language that decides what features to add based solely on demand. Of course demand plays a role, but it is not the determining factor.
Go 是否增加某個(gè)特性,需求不是決定因素!
這就是 Go 一直堅(jiān)持的理念:大道至簡(jiǎn)!節(jié)制!!!有人不喜歡,有人罵,但同樣也會(huì)有人喜歡,有人愛(ài)。對(duì)我來(lái)說(shuō),挺喜歡 Go 的簡(jiǎn)單,Go 的節(jié)制!
最近有人在這個(gè)提案接著問(wèn):
Rust 支持了,包括 PostgreSQL 數(shù)據(jù)庫(kù)也支持,Go 還不支持嗎?該提案的作者給出了回復(fù):
閑扯一句:不知道大家看出什么異樣了嗎?歡迎留言。
最后,int128/uint128 目測(cè)遲早應(yīng)該會(huì)支持,因?yàn)?ianlancetaylor 在設(shè)計(jì)泛型時(shí),考慮了對(duì)該類(lèi)型的兼容問(wèn)題。這個(gè)問(wèn)題我們以后再聊。






























