为啥 Go 没有计算整数绝对值的函数?
Posted
技术标签:
【中文标题】为啥 Go 没有计算整数绝对值的函数?【英文标题】:Why doesn't Go have a function to calculate the absolute value of integers?为什么 Go 没有计算整数绝对值的函数? 【发布时间】:2019-08-25 19:05:46 【问题描述】:在 Go 中,为什么没有直接计算整数数据类型绝对值的函数?目前,所有整数值都必须类型转换为float64
,然后传递给math.Abs()
,它返回一个float64
,它必须再次类型转换为整数。
此代码引发./prog.go:12:39: cannot use x (type int64) as type float64 in argument to math.Abs
错误,因为 Go 是一种静态类型语言,因此它不允许使用不同的数据类型:
package main
import (
"fmt"
"math"
)
func main()
fmt.Println("Hello, playground")
var x int64 = -10
fmt.Println("Abolute value ", math.Abs(x))
【问题讨论】:
将整数转换为浮点数以使用math
包,然后再转换回整数几乎从来都不是正确的做法。大多数简单的math
函数存在于float64
的唯一原因是浮点数通常有许多极端情况(例如涉及NaN 和无穷大),这些情况很难正确处理;整数没有这些问题。
【参考方案1】:
From Go's FAQ,
标准库的目的是支持运行时、连接到操作系统并提供许多 Go 程序所需的关键功能,例如格式化 I/O 和网络。它还包含对 Web 编程很重要的元素,包括加密和对 HTTP、JSON 和 XML 等标准的支持。
没有明确的标准来定义包含的内容,因为长期以来,这是唯一的 Go 库。但是,有一些标准可以定义今天添加的内容。
标准库的新增内容很少,而且包含的门槛很高。包含在标准库中的代码需要承担大量的持续维护成本(通常由原作者以外的人承担),受 Go 1 兼容性承诺(阻止对 API 中的任何缺陷的修复)的约束,并且受 Go 版本的约束安排,防止错误修复快速提供给用户。
大多数新代码应该存在于标准库之外,并且可以通过 go 工具的 go get 命令访问。这样的代码可以有自己的维护者、发布周期和兼容性保证。用户可以在 godoc.org 上找到包并阅读他们的文档。
针对创建数学包的浮点函数的整数版本是多么容易,Go 团队成员 Russ Cox once quipped,
Ceil、Floor 和 Trunc 更简单!
一个合理的解释是,由于这个函数写起来很简单(如果 x float version比较:
func Abs(x float64) float64
return Float64frombits(Float64bits(x) &^ (1 << 63))
这很有用但也不明显,这是将其包含在标准库中的一个令人信服的理由。
【讨论】:
【参考方案2】:绝对值只是绝对差 [1] 的一个特例,其中 第二个值为零。这是整数的绝对值函数,以及 整数的绝对差分函数。奖金是绝对差异 无符号整数函数:
package math
func absInt(x int) int
return absDiffInt(x, 0)
func absDiffInt(x, y int) int
if x < y
return y - x
return x - y
func absDiffUint(x, y uint) uint
if x < y
return y - x
return x - y
-
https://wikipedia.org/wiki/Absolute_difference
【讨论】:
【参考方案3】:虽然没有标准功能,但您始终可以自己编写或使用第三方解决方案。 This package 包含所有内置有符号整数类型的 Abs
函数。用法(go get
之后):
import (
"fmt"
"github.com/adam-lavrik/go-imath/i64" // Functions for i64 type
)
...
x := int64(-2)
fmt.Println(i64.Abs(x)) // Output: 2
x = i64.Minimal // Minimal negative value of int64, has no positive pair
fmt.Println(i64.Absu(x)) // Output: 9223372036854775808 (result is converted to uint64)
【讨论】:
以上是关于为啥 Go 没有计算整数绝对值的函数?的主要内容,如果未能解决你的问题,请参考以下文章