Go的变量
全局变量(在函数体之外的变量)
- 声明方式:
var 变量名 变量类型
- 赋值:
变量名 = 变量的值或表达式
- 声明的同时赋值:
var 变量名 [变量类型] = 变量的值或表达式
- 变量的类型可以省略,由系统自动推断
var a int = 1 var b = 2.1
- 多个全局变量的声明可以使用
var()
合并(当然也能同时赋值)
除了使用var ( a int b bool str string )
var()
合并的方式,也可以使用并行的方式:var a, b, c int a, b, c = 1, 2, 3
局部变量(函数体内或者方法体内)
- 可以和上面的全局变量一样,使用
var 变量名 [变量类型] = 变量值或表达式
这种方式来声明和赋值 - 除了以上的方式,还可以使用
:=
的形式简写(可以省略掉var
关键字,这种方式只能是局部变量使用)a := 1 b := "hello"
- 多个局部变量的声明不可用
var()
这种方式,只能使用并行方式,可以结合简写形式使用a, b, c := 1, 2, "abc"
需要注意几点:
- 如果声明了一个局部变量却没有在代码块中使用它,会得到编译错误:
变量名 declared but not used
(坚决不冗余~~~) - 如果在相同的代码块中,我们不可以再次对于相同名称的变量使用初始化声明(赋值可以)
- 所有变量都可以使用类型推断(但是一些特定类型如
int32
这种就难以自动推断了) - 尽管变量的标识符必须是唯一的,但你可以在某个代码块的内层代码块中使用相同名称的变量,则此时外部的同名变量将会暂时隐藏(结束内部代码块的执行后隐藏的外部同名变量又会出现,而内部同名变量则被释放),你任何的操作都只会影响内部代码块的局部变量
- 可以使用
_
来表示抛弃值_, a = 1, 2
类型转换
- Go中不存在隐式转换,所有类型转换必须显示声明
- 转换只能发生在两种相互兼容的类型之间 (比如数值型和布尔型之间就无法转换)
- 类型转换的格式:
变量A = 类型(变量B)
var a float32 = 1.1 b := int(a)
Go的常量
-
常量使用关键字
const
定义,用于存储不会改变的数据 -
常量的定义格式与变量基本相同,
const 常量名 [常量类型] = 常量值
,其中常量类型可以省略,由系统自动推断const PI = 3.141592658 const str string = "hello"
-
多个常量的定义方式同多个变量的定义方式类似,如果有多个常量需要定义赋值,可以使用
const()
常量组的方式合并。const( PI = 3.141592658 str = "hello" )
如果不提供初始值,将使用上行常量的值:
const( a = "A" b // b为 “A” )
-
常量的值必须在编译时就能确定,可以在赋值表达式中涉及计算过程,但是所有用于计算的值必须在编译期间就能获得
-
自定义的函数在编译期间均属于未知,因此无法用于常量的赋值,但一些内置函数比如
len()
就可以使用 -
反斜杠
\
在常量表达式中可以作为多行的连接符使用const c = 0.4232324242328786350073402\ 378371802711809823413478937
-
使用常量来用作枚举
const ( Spring = 1 Summer = 2 Autumn = 3 Winter = 4 )
除了上面这种写法,还可用常量的计数器
iota
来操作,它从0开始,常量组中每定义一个新的常量,该值自动加1。每当遇到一个新的const
关键字,iota
的值会重置为0。上面的枚举可以用下面的形式来表示(Summer
、Autumn
、Winter
没有赋值,它们的值取上一行的值,即iota
)const ( Spring = iota //Spring=iota=0 Summer //Summer=iota=1 Autumn //Autumn=iota=2 Winter //Winter=iota=3 ) const ( //这里新定义了一个常量组,iota的值置为0 Man = iota //Man=iota=0 Female //Female=iota=1 )