持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
1.常量以及iota
常量使用关键字 const 定义,用于存储不会改变的数据。存储在常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。常量的定义格式:const identifier [type] = value
const Pi = 3.14159
在 Go 语言中,可以省略类型说明符 [type],因为编译器可以根据变量(常量)的值来推断其类型。
显式类型定义: const b string = "abc"隐式类型定义: const b = "abc"
一个没有指定类型的常量被使用时,会根据其使用环境而推断出它所需要具备的类型。换句话说,未定义类型的常量会在必要时刻根据上下文来获得相关类型。
常量的值必须是能够在编译时就能够确定的;你可以在其赋值表达式中涉及计算过程,但是所有用于计算的值必须在编译期间就能获得。
在这iota 可以被用作枚举值:
const ( a = iota b = iota c = iota)
第一个 iota 等于 0,每当 iota 在新的一行被使用时,它的值都会自动加 1;所以 a=0, b=1, c=2 可以简写
const ( a = iota b c)
注意:
const ( a = iota b = 8 c)
a, b, c分别为0, 8, 8,新的常量b声明后,iota 不再向下赋值,后面常量如果没有赋值,则继承上一个常量值。
可以简单理解为在一个const块中,每换一行定义个常量,iota 都会自动+1。
( 关于 iota 的使用涉及到非常复杂多样的情况 ,这里不展开来讲了,有兴趣可以查查资料研究)
iota 也可以用在表达式中,如:iota + 50。在每遇到一个新的常量块或单个常量声明时, iota 都会重置为 0( 简单地讲,每遇到一次 const 关键字,iota 就重置为 0 )。
使用位左移与 iota 计数配合可优雅地实现存储单位的常量枚举:
type ByteSize float64const ( _ = iota // 通过赋值给空白标识符来忽略值 KB ByteSize = 1<<(10*iota) MB GB TB PB EB ZB YB)
常量之所以为常量就是恒定不变的量,因此我们无法在程序运行过程中修改它的值;如果你在代码中试图修改常量的值则会引发编译错误。同时,在const 定义中,对常量名没有强制要求全部大写,不过我们一般都会全部字母大写
2.作用域
- 局部变量 在函数体内声明的变量称之为局部变量,它们的作用域只在函数体内,参数和返回值变量也是局部变量。
- 全局变量 作用域都是全局的(在本包范围内) 在函数体外声明的变量称之为全局变量,全局变量可以在整个包甚至外部包(被导出后)使用。 全局变量可以在任何函数中使用。
- 简式变量 使用 := 定义的变量,如果新变量p与那个同名已定义变量 (这里就是那个全局变量p)不在一个作用域中时,那么Go 语言会新定义这个变量p,遮盖住全局变量p。刚开始很容易在此犯错而茫然,解决方法是局部变量尽量不同名。
简式变量只能在函数内部声明使用,但是它可能会覆盖函数外全局同名变量。而且不能在一个单独的声明中重复声明一个变量,但在多变量声明中这是允许的,而且其中至少要有一个新的声明变量。重复变量需要在相同的代码块内,否则将得到一个隐藏变量。
如果在代码块中犯这个错误的话 ,将不会出现编译错误,但应用运行结果可能不对。所以尽可能避免和全局变量同名。