在Go语言中,为什么没有直接计算整数数据类型的绝对值的函数?目前,所有的整数值都必须被类型转换为float64
,然后传递给math.Abs()
,math.Abs()
返回一个float64
,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))
}
4条答案
按热度按时间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比较:
这是有用的,但也不是显而易见的,这是将其包含在标准库中的一个令人信服的理由。
xesrikrc2#
绝对值只是绝对差[1]的一个特例,其中第二个值为零。这里是整数的绝对值函数,以及整数的绝对差函数。Bonus是无符号整数的绝对差函数:
xbp102n03#
虽然没有标准函数,但您可以自己编写或使用第三方解决方案。This package包含所有内置有符号整数类型的
Abs
函数。用法(go get
之后):xjreopfe4#
这是微不足道的,对于泛型来说更是微不足道。为每个整数类型写一次: