go - 将 10 的幂写成常数

标签 go constants iota

我正在阅读最近发布的 The Go Programming Language ...

我在第 3 章遇到了以下练习:

Exercise 3.13 Write const declarations for KB, MB, up through YB as compactly as you can.

(注意:在此上下文中,KB、MB 等表示 1000 的幂)

在这之前有一节 iota 被介绍为一个有用的常量生成器机制;特别是,上一段展示了一种将 1024 的幂定义为常量的简洁方式:

const (
    _ = 1 << (10 * iota)
    KiB
    MiB
    GiB
    TiB
    PiB
    EiB
    ZiB
    YiB
)

作者进一步提到了关于 10 的幂:

The iota mechanism has its limits. For example, it's not possible to generate the more familiar powers of 1000 (KB, MB, and so son) because there is no exponentiation operator.

我正在为这个练习而苦苦挣扎,因为看起来预期的解决方案比简单地手工拼出 1000 的幂要复杂一些(特别是因为它出现在 iota 被引入之后) .我觉得有一些聪明的方法可以做到这一点,即以微妙的方式结合使用 iota 和其他东西。

我想找到一种系统的方法来从 1024 的每次幂中减去“多余”的量以获得 1000 的幂,但它使我无处可去。然后我查看了二进制表示,试图推断出 iota 可能有用的一般模式,但同样,我一无所获。

我真的看不出在没有求幂运算符的情况下如何从单个递增值 (iota) 中生成 1000 的幂。

有什么想法吗?

最佳答案

你自己引用的:

The iota mechanism has its limits. For example, it's not possible to generate the more familiar powers of 1000 (KB, MB, and so son) because there is no exponentiation operator.

作者不希望您在不知道任何方法的情况下仍然找到方法。作者希望您为 KB、MB 等创建常量声明。尽可能紧凑

使用 float

这是一个紧凑的方法。这利用了 Floating-point literals与指数部分。想一想:编写 1e3 比编写 1000 还要短(更不用说其余的......)。

还将所有标识符压缩到一个常量规范中,因此我们将 = 符号减少为 1。

在这里,只有一行(67 个字符,没有空格):

const ( KB, MB, GB, TB, PB, EB, ZB, YB = 1e3, 1e6, 1e9, 1e12, 1e15, 1e18, 1e21, 1e24 )

请注意,由于我们使用了浮点文字,常量标识符(KBMB...)表示浮点常量,即使文字的小数部分为零。

使用整数文字,使用KB作为乘数

如果我们想要无类型的整数常量,我们必须为 KB 编写 1000。为了得到下一个,我们会自动转向将前一个标识符乘以 1000。但请注意,我们还可以将下一个与 KB 相乘,因为它恰好是 1000 - 但要短两个字符 :)。

下面是无类型整型常量声明(77 个字符,无空格):

const (KB,MB,GB,TB,PB,EB,ZB,YB = 1000,KB*KB,MB*KB,GB*KB,TB*GB,PB*KB,EB*KB,ZB*KB)

(很抱歉删除了空格,但希望它适合一行。)

使用整数文字,使用额外的 x 常量作为乘数

如果您还引入一个长度为 1 个字符的常量 x,您甚至可以从上一个解决方案中获得 3 个字符,您多次使用它来执行乘法而不是 *KB:

使用额外的 x 常量(74 个字符,不带空格):

const (x,KB,MB,GB,TB,PB,EB,ZB,YB = 1000,x,x*x,MB*x,GB*x,TB*GB,PB*x,EB*x,ZB*x)

使用rune文字

如果我们指定 1000 常量作为 rune 常量,我们甚至可以将它再缩短一个字符, rune 的代码点是 1000,即 'ψ' - 少 1 个字符 :)

使用 rune 文字 'ψ' 常量(73 个字符,不带空格):

const (x,KB,MB,GB,TB,PB,EB,ZB,YB = 'Ϩ',x,x*x,MB*x,GB*x,TB*GB,PB*x,EB*x,ZB*x)

请注意,这些将是 rune 常量,但就像所有其他数字常量一样,它们表示任意精度的值并且不会溢出。

关于go - 将 10 的幂写成常数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34124294/

相关文章:

http - 禁用从服务器接收到的带有错误 header 的 HTTP 正文的解压缩

sql-server - 适用于 Windows7 64 位的 Golang MSSQL 驱动程序

c++ - const set& 的问题。编译器/STL 错误或不可移植的用法?

c++ - 静态 const 成员变量的部分特化

docker - IOTA "one-click-tangle"通过 docker linux 容器 - 错误 1

go - 使用 go/ast 进行 iota 声明

c++ - 使用 std::iota 填充字母 vector

Golang——资源应该放在哪里

go - 有没有一种方法可以通用地表示一组相似的函数?

c++ - 防止更改作为指针返回的对象