GO 语言学习 之 变量和常量
变量
变量顾名思义,存储的内容是不确定,只有在执行赋值后那一刻是确定的,因为你也不知道赋值后会不会被修改。
变量定义方式:
- var <变量名> <变量类型>
- <变量名> := <变量值>
- var (a int, b, c....)
示例:
package mainimport "fmt"func main() {var a int // 定义一个整型变量,默认是零值 (整形的零值是 0)b := 1 // 定义一个整型变量,并赋值为 1fmt.Printf("a = %d b = %d\n", a, b)// 定义相同类型的变量var (c,d,e = 10)fmt.Printf("c = %d d = %d e = %d\n", c, d, e)// 定义相同类型的变量var f, g, h string = "hi", "boy", "go"fmt.Printf("f = %s g = %s h = %s\n", f, g, h)// 定义多个不同类型的变量,我想通常没人这么写吧,也保不齐会有var i int, j float64, k []intfmt.Printf("i = %d j = %f k = %v\n", i, j, k)// 定义不相同类型的变量var (l string,m []int,n = 10)fmt.Printf("l = %s m = %v n = %d\n", l, m, n)// 多点几次看看有没有意外收获var ch chan intfmt.Printf("ch %v\n", ch)fmt.Printf("ch %v\n", ch)
}
扩展知识:
1. 各种数据类型的零值
整数类型: 0
浮点数类型: 0.000000
复数类型: 0+0i
布尔类型: false
字符串类型: ""
指针类型: nil
切片类型 : []
映射类型: <nil>
chan类型:<nil>
建议自己打印验证一下吧。
2. go 代码里面的变量,如果你定义了,你就得用,否则就会报错
3. 一种特殊的变量:下划线开头的变量, 声明变量可以不被使用,编译不报错
作用域
全局变量:
定义在函数外部的变量,其作用域是整个包。在同一个包内的所有函数都可以访问全局变量(包可以理解为同一个目录里面的所有go文件,都可以使用全局变量,不包含子目录)
局部变量:
- 定义在函数内部的变量,其作用域仅限于函数内部或代码块内部。
- 定义在语句块内部的变量,作用域仅限于语句块内部使用
扩展知识:
- 包级作用域:在 Go 语言中,全局变量具有包级作用域,即在定义它们的包内的任何地方都可以访问。只要在包内的函数、方法等代码块中,都能直接使用包内的全局变量(如果变量未导出,在包外无法访问)。
- 不同包之间隔离:不同包之间的全局变量是相互隔离的,一个包无法直接访问另一个包的未导出全局变量,这有助于实现封装和模块化编程,使得每个包可以独立维护和演进,而不会对其他包造成意外影响。
常量
常量可以理解为,一种特殊的变量,但其值是不会发生变化的,且不允许修改。这里只是让你这么理解不要真的这么使用。
常量定义方式:
- const <常量名> = <常量值>
- const (<常量名1>, <常量名2>. ...)
示例:
package mainimport "fmt"const PIE = 3.14const (MAN = 1,WOMAN = 2,
)const (ERR_TYPE = "error type"ERR_INPUT_PARAMS = "error input PARAMS"ERR_OUTPUT_PARAMS = "error input PARAMS"ERR_VALUE_RANGE = "outof range"
)const (A = iotaB,C,D
)func main() {fmt.Printf("A %d B %d ERR_TYPE %s", A, B, ERR_TYPE)
}
扩展知识:
- 常量定义,未使用,可以编译成功,且运行正常
- 常量只能使用基本数据类型的值,不能使用复杂类型(切片,接口,结构体,数值等)
作用域
包级常量
在包内但在函数外部定义的常量,称为包级常量。包级常量的作用域是整个包。在同一个包内的任何函数、方法或其他代码块中都可以直接访问该常量。如果包被其他包导入,且常量名是导出的(首字母大写),那么其他包也可以访问这个常量。
局部常量
在函数内部或代码块内部定义的常量,称为局部常量。局部常量的作用域仅限于其定义所在的函数或代码块。一旦程序执行离开该函数或代码块,该常量就超出了作用域,无法再被访问。