- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
以下示例使用 iota 定义了一系列从 3333 开始的端口号。
package main
import (
"fmt"
)
const (
FirstPort = iota+3333
SecondPort
ThirdPort
)
func main() {
hostAndPort := "localhost:"+fmt.Sprint(SecondPort)
fmt.Printf("%s", hostAndPort )
// Output:
// localhost:3334
}
当组合主机名和端口时,我想避免将端口常量包装在 fmt.Sprint
中并简单地编写,例如 "localhost:"+SecondPort
。有没有办法使用 iota 将端口号定义为字符串常量,例如 "3334"
?
以下不起作用:
FirstPort = string(iota + 3333)
也没有
FirstPort = fmt.Sprintf("%d", iota + 3333)
最佳答案
Within a constant declaration, the predeclared identifier
iota
represents successive untyped integer constants.
因此 iota
为您提供整数常量。如果我们想要 string
常量,我们需要找到一种方法将整数转换为其以 10 为底的 string
表示形式。这种方式必须是 constant expression , 否则我们不能在常量声明中使用它。
对我们来说不幸的是,一个简单的类型 conversion从整数到 string
不会产生数值的 base-10 表示,但是:
Converting a signed or unsigned integer value to a string type yields a string containing the UTF-8 representation of the integer.
因此结果将是一个包含单个 rune 的字符串
,其值(Unicode 代码点)是源编号。
同时调用“转换器”功能,例如 strconv.Itoa()
或 fmt.Sprint()
是不可能的,因为调用这些函数不能是常量表达式的一部分,所以结果只能用于变量声明(更不用说我们不能使用 iota
,它只允许在常量声明中)。
但还是有办法的。
我认为这不值得麻烦和可读性的损失,但实际上你可以定义 string
常量 使用 iota
.
该解决方案从数字构建“完整”数字。我们可以通过连接数字的数字(作为 string
值)来获得以 10 为底的 string
表示。
要解决的最后一个问题是如何“列出”数字的数字。这是简单的算术:
i % 10
。i/10 % 10
。i/100 % 10
。要获得一个数字(在0..9
范围内)的rune
,我们可以简单地添加'0'
到它,并将它转换为 string
。仅此而已。
这就是我们如何将其编码为 1 位字符串数字:
n0 = string('0'+iota%10)
对于 2 位数字:
n00 = string('0'+iota/10%10) + string('0'+iota/1%10)
对于 3 位数字:
n000 = string('0'+iota/100%10) + string('0'+iota/10%10) + string('0'+iota/1%10)
让我们看看它的实际效果:
const (
P00 = string('0'+iota/10%10) + string('0'+iota/1%10)
P01
P02
P03
P04
P05
P06
P07
P08
P09
P10
P11
P12
P13
P14
P15
P16
P17
P18
P19
P20
)
打印结果:
fmt.Printf("%v\n%v\n%v\n%v\n%v\n%v\n%v\n%v\n%v\n%v\n%v\n%v\n%v\n%v\n%v\n%v\n%v\n%v\n%v\n%v\n%v\n",
P00, P01, P02, P03, P04, P05, P06, P07, P08, P09,
P10, P11, P12, P13, P14, P15, P16, P17, P18, P19, P20)
输出(在 Go Playground 上尝试):
00
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
到目前为止一切顺利,但我们如何让它从 3333
开始?
也不是问题,很容易就能实现。我们可以移动 iota,只需向它添加一个“初始”数字即可。这就是全部。
让我们看一个示例,其中第一个数字是 3339
:
const (
P3339 = string('0'+(iota+3339)/1000%10) +
string('0'+(iota+3339)/100%10) +
string('0'+(iota+3339)/10%10) +
string('0'+(iota+3339)/1%10)
P3340
P3341
)
func main() {
fmt.Println(P3339)
fmt.Println(P3340)
fmt.Println(P3341)
}
上面的输出是预期的(在 Go Playground 上尝试):
3339
3340
3341
关于string - 用 iota 枚举字符串常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52208395/
我假设“i”是递增的,而“a”是分配的,但我无法弄清楚或找到答案。此外,它看起来与我认为令人困惑的非标准 itoa 非常相似。 最佳答案 C++ iota 不是首字母缩写词或首字母缩写词。就是“iot
在下面的代码中: const ( signature uint32 = 0xae3179fb dhkxGroup = 2 ReplySuccessful byte = iota
这三种填充 vector 的方式之间是否存在性能差异? #include #include #include #include int main() { std::vector v(1
iota 模板函数已添加到标准库中,以用递增的值序列填充迭代器范围。 template void iota(ForwardIterator first, ForwardIterat
iota函数以前在 中 header 。已改为 . 我需要保留旧方法以实现向后兼容性,因此我想使用预处理器选项来选择要包含的正确 header 。 这什么时候改变了,我应该使用哪个预处理器选项?
以下示例使用 iota 定义了一系列从 3333 开始的端口号。 package main import ( "fmt" ) const ( FirstPort = iota+3333 Sec
来自 Python 世界,我找到了函数 std::iota非常有限。为什么接口(interface)被限制为不带任何 UnaryFunction ? 例如我可以转换 >>> x = range(0,
作为标题,golang中iota的全称是什么(不是用法): const ( // iota is reset to 0 c0 = iota // c0 == 0 c1 = iota
Iota 是一种非常小的“编程语言”,只使用一个组合器。我有兴趣了解它的工作原理,但是以我熟悉的语言查看实现会很有帮助。 我找到了一个用 Scheme 编写的 Iota 编程语言的实现。不过,我在将其
ranges-v3库中的closed_iota和iota有什么区别? 最佳答案 第二种遵循标准的C++表达范围的方法-默认为右侧打开范围。第一个是包容性的。iota接受两个参数:start和end。它
由于没有基于索引的parallel for algorithm在 c++17 , 我想知道 ranges::view::iota可以与std::for_each结合使用模仿那个。即: using na
再次提出这个问题,我深表歉意。我之前就 Haskell 实现问过这个问题 here ,但我仍然难以理解这是如何工作的。此外,我发现极简编程语言的概念绝对令人着迷并且无法摆脱它......无论如何,这不
我最近一直在利用 iota递增 int 类型 vector 的语句.但现在我正在尝试使用该语句来递增具有 2 个成员的显式类。 下面是整数 vector 的用法: vector n(6); iota
为了了解 C++11 的复杂性,我正在研究 unique_ptr有一点。 我想知道,有什么办法可以使用iota吗?初始化 unique_ptr 的容器? 我从 unique-ptr-less 解决方案
我试图编译这段代码:- #include using namespace std; int main() { vector v(5); iota(v.begin(), v.end()
以下程序打印出一副洗好的纸牌(作为整数): #include #include #include #include typedef unsigned int card; typedef std
请原谅我对 Go 的了解非常有限。我有这样的定义 type ErrorVal int const ( LEV_ERROR ErrorVal = iota LEV_WARNING
我有这个 Go 代码: package main import "fmt" type baseGroup int const ( fooGroup baseGroup = iota + 1
假设我们有一个 map[int]string我们想这样定义它: var a map[int]string = { 1: "some" 3: "value" 4: "maintained" 7
假设我有下一个 c 程序: #include int main(int args, char* argv[]) { enum RC { APPLE=0, OR
我是一名优秀的程序员,十分优秀!