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

jv2fixgn  于 2023-09-28  发布在  Go
关注(0)|答案(4)|浏览(119)

在Go语言中,为什么没有直接计算整数数据类型的绝对值的函数?目前,所有的整数值都必须被类型转换为float64,然后传递给math.Abs()math.Abs()返回一个float64float64再次被类型转换为整数。
这段代码引发了一个./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))  
}
wh6knrhe

wh6knrhe1#

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

func Abs(x float64) float64 {
    return Float64frombits(Float64bits(x) &^ (1 << 63))
}

这是有用的,但也不是显而易见的,这是将其包含在标准库中的一个令人信服的理由。

xesrikrc

xesrikrc2#

绝对值只是绝对差[1]的一个特例,其中第二个值为零。这里是整数的绝对值函数,以及整数的绝对差函数。Bonus是无符号整数的绝对差函数:

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
}
  1. https://wikipedia.org/wiki/Absolute_difference
xbp102n0

xbp102n03#

虽然没有标准函数,但您可以自己编写或使用第三方解决方案。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)
xjreopfe

xjreopfe4#

这是微不足道的,对于泛型来说更是微不足道。为每个整数类型写一次:

import "golang.org/x/exp/constraints"

func Abs[T constraints.Integer](x T) T {
    if x < 0 {
        return -x
    }
    return x
}

相关问题