变量是程序运行时才确定其值,而常量是程序在编译时就确定了其值
变量是对一块数据存储空间的引用,即变量名可以看做该数据存储空间的别名,我们可以通过该变量名来使用这一块数据存储空间。变量属于临时变量,当程序运行完后,会释放该块存放数据的空间,而变量也会随着空间释放而消失
变量声明格式
参数:var为声明关键字,name为变量名,type为数据类型,value为变量值
1、var name type(全定义声明格式)
该声明格式为标准变量声明格式,若不赋予初始值则会使用默认值
进程会向内存申请一个名称为name的变量,指定内存大小为type尺寸,值为默认值
数字类型默认值:0
string类型默认值:“”
complex默认值:(0+0i)
bool默认值:false
error默认值:
2、var name = value(类型推导声明格式)
该声明格式为类型推导格式,变量会根据value值来自行判断数据类型,内存尺寸自动匹配
3、name := value(省略声明格式)
该声明格式为省略声明格式,省略var来声明变量,使用操作符 := 可以高效的创建变量,但需要注意的是左边的变量不能是已存在的变量并且该变量不能用于函数体外
声明不同类型的多个变量
var ( name1 type1
name2 type2)
声明同类型的多个变量
var name1,name2 type
var name1,name2 = value1,value2
name1,name2 := value1,value2
在Go语言中,变量初始化和变量赋值为两个概念
在一个程序汇中,当你声明了一个变量后,你必须在下面引用过该变量,否则会编译错误
Go语言支持多重赋值,即在两个变量进行交换其值时,不必在引用第三个变量
匿名变量的值为你所要丢弃的值,即当你不需要这个返回值或者值时,你可以使用匿名变量来接受这个值
匿名变量使用下划线(‘_’ )表示
func GetName() (firstName, lastName, nickName string) {
return "May", "Chan", "Chibi Maruko"
}
若只想获得nickName,则函数调用语句可以用如下方式编写:
_, _, nickName := GetName()
局部变量是指在函数体内声明的变量,它的作用于只在函数体内,参数和返回值变量也是局部变量
全局变量是指在函数体外声明的变量,它可以在整个包甚至外部包(被导出后)使用,全局变量可以在任何函数中使用
注意:程序中全局变量和局部变量名称可以相同,但是函数内的局部变量会被优先考虑
在Go语言中,常量是指编译期间就已知且不可改变的值,它可以是数值类型、布尔类型、字符串类型等
字面常量是指程序中硬编码的常量。如100、-1为浮点类型的常量;true为布尔类型的常量
Go语言的字面常量更接近我们自然语言中的常量概念,它是无类型的。只要这个常量在相应类型的值域范围内,就可以作为该类型的常量,比如上面的常量100可以赋值给int、uint、int32等类型的变量
常量定义通过const关键字,它可以限定常量类型,但不是必须的。如果定义常量是没有指定类型,那么它和字面常量一样是无类型的变量
常量定义的右值可以是一个在编译器运算的常量表达式,但不可以是需要运行期才能得出结果的表达式
const mask = 1 << 3 //√
const Home = os.Getenv("HOME") //×
Go语言预定义了这些常量:true、false和iota
iota比较特殊,可以认为是一个可被编译器修改的常量,在每一个const关键字出现时被重置为0,然后在下一个const出现之前,每出现一次iota,其值会自动加一
上图例子中,通过const跟一对圆括号的方式定义一组常量,这种定义法在Go语言中通常用于定于枚举值,Go语言并不支持其他语言明确支持的enum关键字
Go语言内置的运算符有:
注意:Go语言有i++,但没有++i;除法运算其分母不能为0