首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么Go没有一个函数来计算整数的绝对值?

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

Stack Overflow用户
提问于 2019-08-26 03:05:47
回答 3查看 9.5K关注 0票数 15

在Go中,为什么没有直接计算整数数据类型绝对值的函数?目前,所有整数值都必须被类型转换为float64,然后传递给math.Abs(),它返回一个float64,它也必须被类型转换为整数。

此代码会引发./prog.go:12:39: cannot use x (type int64) as type float64 in argument to math.Abs错误,因为Go是一种静态类型的语言,因此它不允许使用不同的数据类型:

代码语言:javascript
运行
复制
package main

import (
    "fmt"
    "math"
)

func main() {
    fmt.Println("Hello, playground")
    var x int64 = -10
    
    fmt.Println("Abolute value ", math.Abs(x))  
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-08-26 04:35:21

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< 0,x= -x),它不符合包含的标准。与float version进行比较

代码语言:javascript
运行
复制
func Abs(x float64) float64 {
    return Float64frombits(Float64bits(x) &^ (1 << 63))
}

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

票数 16
EN

Stack Overflow用户

发布于 2021-07-07 05:40:16

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

代码语言:javascript
运行
复制
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
票数 3
EN

Stack Overflow用户

发布于 2020-01-04 22:03:57

虽然没有标准的函数,但你可以自己编写或者使用第三方解决方案。This package包含用于所有内置有符号整数类型的Abs函数。用法(在go get之后):

代码语言:javascript
运行
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57648933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档