Go语言基础之变量和常量
标识符与关键字
标识符
在编程语言中标识符就是程序员定义的具有特殊含义的词: 比如 变量名
函数名
常量名
...
Go语言中标识符由: 字母数字下划线组成:举几个例子:abc
, _
, _123
, a123
。
关键字
关键字即是被Go语言赋予了特殊含义的单词,也可以称为保留字。
Go语言中的关键字一共有 25 个:
⚠️注意: 关键字不建议用来做变量名
break | default | func | interface | select |
---|---|---|---|---|
case | defer | go | map | struct |
chan | else | goto | package | switch |
const | fallthrough | if | range | type |
continue | for | import | return | var |
此外,Go语言中还有37个保留字。
append | bool | byte | cap | close | complex | complex64 | complex128 | uint16 |
---|---|---|---|---|---|---|---|---|
copy | false | float32 | float64 | imag | int | int8 | int16 | uint32 |
int32 | int64 | iota | len | make | new | nil | panic | uint64 |
println | real | recover | string | true | uint | uint8 | uintptr |
Go变量
Go
字符串 表示 "我叫春生"
双引号 代表字符串
字符串: ""
var name string = "我叫春生"
Go
字符串 表示 '我'
单引号 代表字符
字符: ''
var name int64 = '我'
变量的来历
程序运行过程中的数据都是保存在内存中,我们想要在代码中操作某个数据时就需要去内存上找到这个变量,但是如果我们直接在代码中通过内存地址去操作变量的话,代码的可读性会非常差而且还容易出错,所以我们就利用变量将这个数据的内存地址保存起来,以后直接通过这个变量就能找到内存上对应的数据了。
变量类型
变量(Variable)的功能是存储数据。不同的变量保存的数据类型可能会不一样。经过半个多世纪的发展,编程语言已经基本形成了一套固定的类型,常见变量的数据类型有:整型、浮点型、布尔型等。
Go语言中的每一个变量都有自己的类型,并且变量必须经过声明才能开始使用
变量声明
go语言中的变量需要声明后才能使用, 同一个作用域 不能重复声明.
并且go变量之后必须使用,不使用就会抛出异常.
标准声明
Go语言声明变量 var
var 变量名 变量类型 = 变量类型相同的值
Go语言先声明后赋值
package main
import (
"fmt"
)
func main() {
var name string // 声明name为字符串类型
var age int // 声明age 为int 类型
var isOk bool // 声明isOk为布尔类型
name = "春生"
age = 18
isOk = true
fmt.Println(name,age,isOk)
}
批量声明
美声明一个变量都要写var
比较繁琐,Go语言中给我们提供了 批量声明:
package main
import (
"fmt"
)
func main() {
// var() 批量声明
var(
name string
age int
isOk bool
)
name = "春生"
age = 18
isOk = true
fmt.Println(name,age,isOk)
}
变量类型推导
有的时候我们会将变量的类型简化省略,这个时候编译器会根据等号右边的值来推导变量的类型完成初始化。
package main
import (
"fmt"
)
func main() {
// 类型推导 go编译器 会直接根据我们变量 右面的值 推导出类型
var name = "春生"
var age = 18
var isOk = true
:=
fmt.Println(name,age,isOk)
}
短变量
短变量 只能在函数内部使用 不能在全局作用域使用
短变量声明方式: :=
package main
import (
"fmt"
)
// 全局变量
var m = 100
func main() {
// 局部变量
name := "春生"
age := 18
isOk := true
fmt.Println(name,age,isOk,m)
}
匿名变量
在使用多重赋值时,如果想要忽略某个值,可以使用匿名变量(anonymous variable)
。 匿名变量用一个下划线_
表示,例如:
func foo() (int, string) {
return 10, "Q1mi"
}
func main() {
x, _ := foo()
_, y := foo()
fmt.Println("x=", x)
fmt.Println("y=", y)
匿名变量不占用命名空间,不会分配内存,所以匿名变量之间不存在重复声明.
注意事项
- 函数外的每个语句都必须以关键字开始(var、const、func等)
:=
不能使用在函数外。_
多用于占位,表示忽略值。
Go常量
相对于变量,常量是恒定不变的值,多用于定义程序运行期间不会改变的那些值。 常量的声明和变量声明非常类似,只是把var
换成了const
,常量在定义的时候必须赋值。
const pi = 3.1415
const e = 2.7182
声明了pi
和e
这两个常量之后,在整个程序运行期间它们的值都不能再发生变化了。
注意 ⚠️:
-
常量是不能更改的
-
常量在定义的时候必须赋值
批量声明常量
多个常量也可以一起声明:
package main
import (
"fmt"
)
// 全局常量
const (
name = "春生"
age = 18
isOk = true
)
func main() {
fmt.Println(name, age, isOk)
}
const同时声明多个常量时,如果省略了值则表示和上面一行的值相同。 例如:
package main
import (
"fmt"
)
// 全局常量
const (
name = "春生"
age
isOk
)
func main() {
fmt.Println(name, age, isOk)
}
上面示例中,常量n1
、n2
、n3
的值都是100。
结果:
春生 春生 春生
Process finished with exit code 0
iota(枚举)
iota
是Go语言常量计数器,只能在常量的表达式中使用
iota
在const
关键字中出现时 会被重置为0,const
中每新增一行常量声明就会被iota
计数一次(iota可理解为const语句块中的行索引)
使用iota能简化定义,在定义枚举时很有用。
例子:
package main
import (
"fmt"
)
// 全局常量 iota
const (
n1 = iota
n2
n3
n4
)
func main() {
fmt.Println(n1, n2, n3, n4)
}
结果:
0 1 2 3
Process finished with exit code 0
常见的iota示例
使用 _
跳过某些值
package main
import (
"fmt"
)
// 全局常量
const (
n1 = iota
n2
_
n4
)
func main() {
fmt.Println(n1, n2, n4)
}
结果:
0 1 3
Process finished with exit code 0
iota
声明中间插队
// 全局常量
const (
n1 = iota
n2 = 100
n3 = iota
n4
)
func main() {
fmt.Println(n1, n2, n3, n4)
}
结果:
0 100 2 3
Process finished with exit code
定义数量级
(这里的<<
表示左移操作,1<<10
表示将1的二进制表示向左移10位,也就是由1
变成了10000000000
,也就是十进制的1024。同理2<<2
表示将2的二进制表示向左移2位,也就是由10
变成了1000
,也就是十进制的8。)
const (
_ = iota
KB = 1 << (10 * iota)
MB = 1 << (10 * iota)
GB = 1 << (10 * iota)
TB = 1 << (10 * iota)
PB = 1 << (10 * iota)
)
多个iota
定义在一行
package main
import (
"fmt"
)
// 全局常量
const (
a, b = iota + 1, iota + 2 //1,2
c, d //2,3
e, f //3,4
)
func main() {
fmt.Println(a,b,c,d,e,f)
}