以下示例使用iota定义从3333开始的一系列端口号。
包主
进口( “FMT”)const(FirstPort = iota + 3333SecondPortThirdPort)func main(){ …
您正在创建无类型数字常量。如有疑问,请检查 规范 。要创建包含主机和端口号的字符串,您只需使用即可 fmt.Sprintf 像这样:
fmt.Sprintf
package main const ( FirstPort = iota+3333 SecondPort ThirdPort ) func main() { hostPort := fmt.Sprintf("localhost:%d", FirstPort) fmt.Println(hostPort) }
这就是它的全部内容: 演示
引自 规格:Iota:
在一个 不断声明 ,预先声明的标识符 iota 表示连续的无类型整数 常量 。
iota
所以 iota 为您提供整数常量。如果我们想要 string 常量,我们需要找到一种方法将整数转换为它的基数为10 string 表示。这种方式必须是一个 不断表达 ,否则我们不能在常量声明中使用它。
string
对我们来说不幸的是,简单的类型 转变 从整数到 string 不会产生数值的基数10表示,但是:
将有符号或无符号整数值转换为字符串类型会生成包含整数的UTF-8表示形式的字符串。
所以结果将是一个 string 持有一个符文,其值(Unicode代码点)是源编号。
还调用“转换器”等功能 strconv.Itoa() 要么 fmt.Sprint() 是不可能的,因为调用那些函数不能成为常量表达式的一部分,因此结果只能用于变量声明(更不用说我们无法使用) iota ,它只允许在常量声明中)。
strconv.Itoa()
fmt.Sprint()
的 但仍有解决方案。 强>
我认为这不值得麻烦和可读性的损失, 但实际上你可以定义 string 常量 使用增加十进制数 iota 。
该解决方案从数字构建“完整”数字。我们可以获得基数-10 string 通过连接数字表示(如 string 价值)。
要解决的最后一个问题是如何“列出”数字的数字。这是一个简单的算术:
i % 10
i / 10 % 10
i / 100 % 10
并获得 rune 对于一个数字(在...范围内) 0..9 ),我们可以简单地添加 '0' 它,并将其转换为 string 。就这样。
rune
0..9
'0'
这就是我们如何为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)
输出(试试吧 去游乐场 ):
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20
到目前为止一切顺利,但我们如何才能开始 3333 ?
3333
也不是问题,可以轻松实现。我们可以 转移 iota,只需添加一个“初始”数字即可。这就是全部。
让我们看一个第一个数字的例子 3339 :
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) }
上面的输出是预期的(试试吧 去游乐场 ):
3339 3340 3341