在編寫Go 程式時,您可能會遇到需要建立可以接受任何數值類型的函數,無論是否它是一個整數或浮點數。這可能具有挑戰性,因為 Go 嚴格區分這些類型。
一種方法是將所有數值參數轉換為 float64,因為此類型涵蓋整數範圍。然而,這可能並不總是可取的,因為在處理大整數時,它可能會導致精確度損失或錯誤。
另一個選擇是為每個數值建立單獨的函數類型,例如整數的 addInt 和浮點數的 addFloat。雖然這確保了類型安全,但可能會導致程式碼重複和維護問題。
隨著 Go 1.18 中類型參數的引入,更多現在可以使用優雅的解決方案。您可以定義採用任何類型 T 的泛型函數,並使用介面約束將 T 限制為數字類型。
例如:
func add[T Number](a, b T) T { return a + b } type Number interface { constraints.Integer | constraints.Float }
此函數可以與任何數字型別一起使用,包括int、int64、float32 和 float64。數字約束確保只允許數字類型。
請記住,泛型函數需要相同類型的參數。例如,add 函數要求兩個參數為相同的數字類型。此外,泛型函數不支援所有運算符,特別是特定於某些類型的運算符(例如整數的位元運算符)。
使用類型參數和介面約束允許您編寫泛型函數可以接受任何數字類型。這種方法提供了類型安全性,同時避免了程式碼重複並提供了更大的靈活性。
以上是如何在 Go 中編寫通用函數來處理任何數值類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!