1 回答

TA貢獻1777條經(jīng)驗 獲得超3個贊
現(xiàn)在您知道為什么(某些)人們想要在 Go 中使用泛型。:-)
對于這種特殊情況,您最好只編寫一個safeDivideInt
函數(shù):
// a/b, but 0 if b == 0
func safeDivideInt(a, b int64) int64 {
? ? if b == 0 {
? ? ? ? return 0
? ? }
? ? return a / b
}
和一個類似的safeDivideUint函數(shù)(使用uint64)...并且,如果需要的話,1個safeDivideFloat函數(shù),例如:
func safeDivideFloat(a, b float64) float64 {
? ? // decide if you want 0/0 handled differently
? ? // decide if you want to check for b being Inf or NaN
? ? // etc.
? ? if b == 0 {
? ? ? ? return 0
? ? }
? ? return a / b
}
如果你愿意的話,然后再一次進行復雜的處理。
但是:沒有簡單的方法可以讓 Go 編譯器為您調(diào)用其中之一。您可以按照您的方式編寫基于接口的函數(shù),然后對各種參數(shù)進行類型切換,但是由于您必須處理所有可能的組合,因此它會變得很長。無論如何減少,組合效應都是痛苦的。使用reflect
和 它的 type-kind 接口在這里沒有幫助,因為您仍然有五種int
類型,五種uint
類型(如果包含 則為六種類型uintptr
),兩種float
類型和兩種complex
類型。(我不清楚在除法函數(shù)中允許使用 或Uintptr
sUnsafePointer
?Kind
是否有任何意義。)
然而,根據(jù)上下文,定義您自己的界面可能更有意義。?這是 Go Playground 上的一個工作玩具示例。我沒有費心放入 Uint 和 Complex 類型。
1請注意,運行時 1.0 / 0.0 是+Inf
。Go規(guī)范說:
浮點或復數(shù)除以零的結果未在 IEEE-754 標準之外指定;是否發(fā)生運行時恐慌是特定于實現(xiàn)的。
但 IEEE-754 默認情況下要求 Inf 和 NaN 結果,異常是可選的,所以我認為這意味著 Go 中的默認情況下不會引發(fā)異常,也意味著“無恐慌”。
算術異常(默認情況下)需要記錄在“粘性”狀態(tài)標志位中。...默認情況下,操作始終根據(jù)規(guī)范返回結果,而不會中斷計算。例如,1/0 返回 +∞,同時還設置被零除標志位(這個默認值 ∞ 的設計目的是為了在后續(xù)操作中使用時經(jīng)常返回有限結果,因此可以安全地忽略)。
- 1 回答
- 0 關注
- 120 瀏覽
添加回答
舉報