Go Constant

  • 常量表示存储不会改变的数据
  • 常量在编译时被创建,即使定义在函数内部也是如此。
  • 由于常量只能在编译时被创建,因此定义常量的表达式必须是能被编译器求值的常量表达式。
  • 常量使用关键字const声明
  • 常量只能是布尔型、数字型、字符串型

常量定义

const name [type] = value

Go语言中可是省略类型说明符type,编译器可以根据值来推导其类型。

  • 显示类型定义:const pi float32 = 3.14159
  • 隐式类型定义:const pi = 3.14159

常量声明可以包含类型和值,若没有显式指定类型,将从右边表达式推断类型。

常量的值必须能在编译时被确定

const num = getNumber() //引发构建错误

常量的运算在编译器完成不仅减少了运行时的工作量,也方便其他代码的编译优化。当操作数是常量时,某些运行时错误可以在编译时被发现,比如整数除零、字符串索引越界、无效浮点数操作等。

批量声明

const (
  pi = 3.14152
  e = 2.7182818
)

批量声明常量时除了第一个外其它的常量右边的初始化表达式都可以被省略,省略初始化表达式的常量会使用前面常量的初始化表达式的值。

const (
  pi = 3.14159
  pi2
)

常量运算

常量之间的算术运算、逻辑运算、比较运算结果也是常量,对常量的类型转换操作结果也是常量。

可用于返回常量结果的函数:lencaprealimagcomplexunsafe.Sizeof

常量的值是在编译器就确定的,因此常量可以构成类型的一部分。

例如:使用常量指定数组类型的长度

const IPv4Len = 4

func parseIPv4(str string) IP{
  var p [IPv4Len]byte
}

常量生成器

常量生成器的作用也就是枚举类型

例如:定义一周每天的常量

type Weekday int

const (
  Sunday Weekday = iota
  Monday
  Tuesday
  Wednesday
  Thursday
  Friday
  Saturday
)
  • 常量声明时可使用iota常量生成器进行初始化
  • iota用于生成一组以相似规则初始化的常量,但不用每行都写一遍初始化表达式。
  • 常量声明语句中,第一个声明常量所在的行,iota将会被置为0,然后在每个常量声明的行自增1。

无类型常量

Go语言常量与众不同之处在于,虽然一个常量可以有任意一个确定的基础类型,但许多常量并没有一个明确的基础类型。

例如:使用math.Pi无类型的浮点数常量,可直接用于任意需要浮点数或复数的地方。

var x float32 = math.Pi
var y float64 = math.Pi
var z complex128 = math.Pi

math.Pi被确定为特定类型,那么在计算中精度可能不太一样。

编译器为没有明确基础类型的数字产量提供比基础类型更高精度的算术运算,至少有256bit的运算精度。

未明确类型的常量可分为无类型的布尔型、无类型的整数、无类型的字符、无类型的字符串、无类型的浮点数、无类型的复数

通过延迟明确常量的具体类型,不仅可以提高运算精度,还可以直接用于更多地表达式而无需显式的类型转换。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值