Golang基础--一篇文章记住iota的所有用法
本文主要是对Golang中iota和const的用法,做了总结,目的就是让你通过这一篇文章就能立马知道iota的用法.
在寻找一篇简洁明了的文章,来帮助你理解iota的作用?如果是这样,那么你来对地方了。在这篇文章中,我将尽可能简洁地解释iota和const特性,并通过实例来展示它们的应用。
速记
iota和const的主要特性可以归纳为以下两点:
- 在const块中,const会隐式重复前一个非空表达式,但要注意要与前一行常量(=号前面的标识符)数量一致。
- iota代表的是所在const行的行号。(这个特性,网上好多复制粘贴的文章的文章都说错了,不是说iota遇到const就变为0).
详细分析
让我们通过一个例子来理解这些特性。考虑以下的Golang代码:
1package main
2
3import (
4 "fmt"
5)
6
7const (
8 i=1<<iota
9 j=3<<iota
10 k
11 l
12)
13
14func main() {
15 fmt.Println("i=",i)
16 fmt.Println("j=",j)
17 fmt.Println("k=",k)
18 fmt.Println("l=",l)
19}
输出结果:
1i= 1
2j= 6
3k= 12
4l= 24
1i=1<<0
2j=3<<1
3k=3<<2
4l=3<<3
const特性:隐式重复前一个非空表达式
Go的const语法有一个隐藏的机制,那就是隐式的重复前一个非空表达式, 这意味着,如果我们在const声明语句块中省略了某个常量的值,那么该常量将使用前一个非空表达式的值。
1const (
2 Apple, Banana = 1, 2
3 Cherimoya, Durian
4 Elderberry,Bole
5)
1const (
2 Apple, Banana = 1, 2
3 Cherimoya, Durian = 1, 2
4 Elderberry,Bole = 1, 2
5)
1const (
2 Apple, Banana = 1, 2
3 Cherimoya, Durian=3
4 Elderberry,Bole
5)
6const (
7 Apple, Banana = 1, 2
8 Cherimoya, Durian
9 Elderberry
10)
11const (
12 Apple, Banana = 1, 2
13 Cherimoya
14 Elderberry,Bole
15)
1const (
2 Apple, Banana = 1, 2
3 Cherimoya, Durian=3, 4
4 Elderberry,Bole
5)
6const (
7 Apple, Banana = 1, 2
8 Cherimoya, Durian
9 Elderberry=3
10)
11const (
12 Apple, Banana = 1, 2
13 Cherimoya=3
14 Elderberry,Bole = 3,4
15)
到这里,我们看上面的例子,其实发现,const这个特性好像没什么意义,只是简单的重复。但如果结合下面要讲的iota的特性,就变得很有用了。
iota特性:iota表示的是这个字段在const中行号
首先我们要知道iota只能在const中使用。iota表示的是他所在的行数,这个与网上的文章说的是不一样的.
1const (
2 b = iota //b=0
3 c //c=1
4)
1const (
2 b = 0 //b=0
3 c = iota //c=1
4)
1const (
2 b = 2 //b=0
3 c = 5 //c=1
4 d =iota
5)
这个跟网上说的iota遇到const就为0,是不一样的。iota代表了这个const常量值所在的位置(行数)。这个要记住.
上面的例子中,我们看到每行只有一个常量,下面我们看看每行有多个常量的情况。
1const (
2 b,b1 = iota,iota+1 //b=0
3 c,c1 //c=1
4)
刚刚说了iota代表了它所在行的序号,所以即使你在同一行上写了两个iota,它所代表的都是当前行的序号。
现在将const和iota的这两个特性结合起来,再来看个const的例子:
1const (
2 Apple, Banana = iota+1, iota+2
3 Cherimoya, Durian
4 Elderberry,Bole
5)
总结:
- const会隐式重复前一个非空表达式,但要注意要与前一行常量数量(=号前面)一致,同一行常量的缺省设置也要一致,不能有的有值,有的没有值。
- iota代表的是所在const行的行号。这个特性跟网上所说的文章都不一样,不是说iota遇到const就变为0,大家一定要注意区别.
只要记住这两个特性,就完全可以理解iota的作用了。不用再去看网上的那些繁复而且是错误的文章。