为什么Go没有计算整数绝对值的函数?

Go中为什么没有直接计算整数数据类型绝对值的函数?目前,所有整数值都必须类型转换为float64,然后传递给math.Abs(),它返回 a 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))  

}


有只小跳蛙
浏览 166回答 3
3回答

宝慕林4294392

从 Go 的常见问题解答中,标准库的目的是支持运行时、连接到操作系统并提供许多 Go 程序所需的关键功能,例如格式化 I/O 和网络。它还包含对 Web 编程很重要的元素,包括加密以及对 HTTP、JSON 和 XML 等标准的支持。没有明确的标准来定义包含的内容,因为很长一段时间以来,这是唯一的 Go 库。然而,有一些标准定义了今天要添加的内容。标准库中新增的内容很少,而且纳入的门槛很高。标准库中包含的代码需要承担大量的持续维护成本(通常由原作者以外的人承担),受到 Go 1 兼容性承诺的约束(阻止修复 API 中的任何缺陷),并且受到 Go 版本的约束安排,防止错误修复快速提供给用户。大多数新代码应该位于标准库之外,并且可以通过 go 工具的 go get 命令访问。这样的代码可以有自己的维护者、发布周期和兼容性保证。用户可以在 godoc.org 上找到软件包并阅读其文档。对于创建 math 包的 float 函数的整数版本是多么容易,Go 团队成员Russ Cox 曾经打趣道:Ceil、Floor 和 Trunc 甚至更容易!一个合理的解释是,由于这个函数编写起来很简单(如果 x < 0,x = -x),因此它不符合包含标准。与浮动版本比较:func Abs(x float64) float64 {     return Float64frombits(Float64bits(x) &^ (1 << 63)) }这是有用但也不明显的,这是将其包含在标准库中的一个令人信服的理由。

白衣染霜花

绝对值只是绝对差[1]的一种特殊情况,其中第二个值为零。这是整数的绝对值函数,以及整数的绝对差函数。Bonus 是无符号整数的绝对差函数:package mathfunc absInt(x int) int {&nbsp; &nbsp;return absDiffInt(x, 0)}func absDiffInt(x, y int) int {&nbsp; &nbsp;if x < y {&nbsp; &nbsp; &nbsp; return y - x&nbsp; &nbsp;}&nbsp; &nbsp;return x - y}func absDiffUint(x, y uint) uint {&nbsp; &nbsp;if x < y {&nbsp; &nbsp; &nbsp; return y - x&nbsp; &nbsp;}&nbsp; &nbsp;return x - y}https://wikipedia.org/wiki/Absolute_difference

浮云间

虽然没有标准功能,但您始终可以自己编写或使用第三方解决方案。该包包含Abs所有内置有符号整数类型的函数。用法(之后go get):import (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "github.com/adam-lavrik/go-imath/i64" // Functions for i64 type)...x := int64(-2)fmt.Println(i64.Abs(x)) // Output: 2x = i64.Minimal // Minimal negative value of int64, has no positive pairfmt.Println(i64.Absu(x)) // Output: 9223372036854775808 (result is converted to uint64)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go