04 | 常量与iota

刀斧手何在 · · 650 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

常量

  • 使用const定义,类型可不指定
const Con string = "hello"
const Constr = "world"
func TestCon(t *testing.T){
    //t.Log(getConNum())
    t.Log(Con)
    t.Log(Constr)
    t.Log(reflect.TypeOf(Con))
}
  • 常量可以是字符、字符串、布尔值或数值(整数型、浮点型和复数)
  • 常量的值必须在编译时就能够确定
func getConNum() int {
    return 1
}

const Con  = getConNum()
func TestCon(t *testing.T){
    //t.Log(getConNum())
    t.Log(Con)
}
//result : const initializer getConNum() is not a constant

当然下面的代码是可以正常运行的,因为string实际上不是函数,而是关键字

const Con  = string(65)
func TestCon(t *testing.T){
    //t.Log(getConNum())
    t.Log(Con)
}
//result : A
  • 无类型数值常量可以在赋值时进行自动类型转化
const Conint = 1
func TestCon(t *testing.T){
    var i8 int8 = Conint
    var i64 int64 = Conint
    t.Log(Conint)
    t.Log(reflect.TypeOf(Conint))
    t.Log(i8)
    t.Log(reflect.TypeOf(i8))
    t.Log(i64)
    t.Log(reflect.TypeOf(i64))
}
//result: 1,int,1,int8,1,int64
//Conint = 1.1 => constant 1.1 truncated to integer 
//Conint = 65536 => constant 65536 overflows int8

  • 批量声明常量。
const (
    a = 1
    b
    c = 1.1
    d
)
func TestCon(t *testing.T){
    t.Log(a,b,c,d)
    t.Log(reflect.TypeOf(a))
    t.Log(reflect.TypeOf(b))
    t.Log(reflect.TypeOf(c))
    t.Log(reflect.TypeOf(d))
}
//result 1,1,1.1,1.1

除了第一个外,其它的常量右边的初始化表达式都可以省略,如果省略初始化表达式则表示使用前面常量的初始化表达式,对应的常量类型也是一样的

  • 常量允许定义后不使用

iota

在常量声明中,预声明的标识符 iota表示连续的无类型整数。它的值为常量定义所在行的索引,从0开始计数。所以 也叫做常量计数器。

const (
    c0 = iota // c0 == 0 iota = 0
    c1 = -1 // c1 == -1 iota = 1(未使用)
    c2,c3 = iota ,iota+2// c2 == 2 c3 == 2+2 iota = 2
    c5 = iota // c5 == 4
)
const c6  = iota //iota = 0
func TestCon(t *testing.T){
    t.Log(c0,c1,c2,c3,c5,c6)
}
  • iota只能在const 定义时使用
func TestCon(t *testing.T){
    t.Log(iota)
}
//result : undefined: iota
  • 实现常量自增
const (
    Sunday = iota
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Partyday
)
func TestCon(t *testing.T){
    t.Log(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Partyday)
}
  • 实现常量移位
const (
    Readable = 1 << iota
    Writeable
    Executable
)
func TestCon(t *testing.T){
    t.Log(Readable,Writeable,Executable)
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:刀斧手何在

查看原文:04 | 常量与iota

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

650 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传