变量是几乎所有编程语言中最基本的组成元素。从根本上说,变量相当于是对一块数据存储空间的命名,程序可以通过定义一个变量来申请一块数据存储空间,之后可以通过引用变量名来使用这块存储空间。
Go语言中的变量使用方式与C语言接近,但具备更大的灵活性。
Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。
声明变量的一般形式是使用 var 关键字
(1) var vName type //定义一个变量,变量名为"vName",type为变量的类型
(2)var vName type=value //定义变量并初始化值,变量的值为value
(3) var vName1,vName2,...vNameN type //定义多个变量并且变量的类型都是type,变量名之间用逗号隔开
(4)var vName1,vName2,vName3 type=v1,v2,v3 //同时定义并初始化多个相同类型的变量的值
(5) var vName1,vName2,vName3 =v1,v2,v3 // 同时定义多个变量的值,变量类型可以不同,会自动根据值的类型来初始化
(6)vName1,vName2,vName3:=v1,v2,v3 //用:=来声明变量
注意:这种方法只能用于声明函数内部的变量,一般用var的方式来定义全局变量
_(下划线)是个特殊的变量,任何赋予它的值都会被丢球。例如:_,b:=34,35 //将值35赋予b,同时丢弃34
go对于在函数内部已经声明但未使用的变量会在编译阶段报错
var v1 int
var v2 string
var v3 [10]int // 数组
var v4 []int // 数组切片
var v5 struct {
f int
}
var v6 *int // 指针
var v7 map[string]int // map,key为string类型,value为int类型
var v8 func(a int) int
变量声明语句不需要使用分号作为结束符。与C语言相比,Go语言摒弃了语句必须以分号作
为语句结束标记的习惯。
var关键字的另一种用法是可以将若干个需要声明的变量放置在一起,免得程序员需要重复
写var关键字,如下所示
var (
v1 int
v2 string
)
我们在使用传统的强类型语言编程时,经常会出现这种情况,即在调用函数时为了获取一个值,却因为该函数返回多个值而不得不定义一堆没用的变量。在Go中这种情况可以通过结合使用多重返回和匿名变量来避免这种丑陋的写法,让代码看起来更加优雅。
假 设GetName()函数的定义如下,它返回3个值,分别为firstName、lastName和nickName:
func GetName() (firstName, lastName, nickName string) {
return "May", "Chan", "Chibi Maruko"
}
若只想获得nickName,则函数调用语句可以用如下方式编写:
_, _, nickName := GetName()
这种用法可以让代码非常清晰,基本上屏蔽掉了可能混淆代码阅读者视线的内容,从而大幅降低沟通的复杂度和代码维护的难度。
就是在程序编译阶段就确定的值,在程序运行过程中无法改变的值
是指程序中硬编码的常量,如:
-12
3.14159265358979323846 // 浮点类型的常量
3.2+12i // 复数类型的常量
true // 布尔类型的常量
"foo" // 字符串常量
在其他语言中,常量通常有特定的类型,比如-12在C语言中会认为是一个int类型的常量。如果要指定一个值为-12的long类型常量,需要写成-12l,这有点违反人们的直观感觉。Go语言的字面常量更接近我们自然语言中的常量概念,它是无类型的。只要这个常量在相应类型的值域范围内,就可以作为该类型的常量,比如上面的常量-12,它可以赋值给int、uint、int32、int64、float32、float64、complex64、complex128等类型的变量。
通过const关键字,你可以给字面常量指定一个友好的名字:
语法:
const constantName (type)=value
//constantName为常量名,type为常量的类型,可以不指定类型,类型可以为布尔,数值,字符串等。例如:
const Pi float64 = 3.14159265358979323846
const zero = 0.0 // 无类型浮点常量
const (
size int64 = 1024
eof = -1 // 无类型整型常量
)
const u, v float32 = 0, 3 // u = 0.0, v = 3.0,常量的多重赋值
const a, b, c = 3, 4, "foo"
// a = 3, b = 4, c = "foo", 无类型整型和字符串常量
Go的常量定义可以限定常量类型,但不是必需的。如果定义常量时没有指定类型,那么它与字面常量一样,是无类型常量。
常量定义的右值也可以是一个在编译期运算的常量表达式,比如
const mask = 1 << 3
由于常量的赋值是一个编译期行为,所以右值不能出现任何需要运行期才能得出结果的表达式,比如试图以如下方式定义常量就会导致编译错误:
const Home = os.GetEnv("HOME")
原因很简单,os.GetEnv()只有在运行期才能知道返回结果,在编译期并不能确定,所以无法作为常量定义的右值。
Go语言预定义了这些常量:true、false和iota。
2.4.1 iota
iota比较特殊,可以被认为是一个可被编译器修改的常量,在每一个const关键字出现时被重置为0,然后在下一个const出现之前,每出现一次iota,其所代表的数字会自动增1。从以下的例子可以基本理解iota的用法:
const ( // iota被重设为0
c0 = iota // c0 == 0
c1 = iota // c1 == 1
c2 = iota // c2 == 2
)
const (
a = 1 << iota // a == 1 (iota在每个const开头被重设为0)
b = 1 << iota // b == 2
c = 1 << iota // c == 4
)
const (
u = iota * 42 // u == 0
v float64 = iota * 42 // v == 42.0w = iota * 42 // w == 84
)
const x = iota // x == 0 (因为iota又被重设为0了)
const y = iota // y == 0 (同上)
如果两个const的赋值语句的表达式是一样的,那么可以省略后一个赋值表达式。因此,上面的前两个const语句可简写为:
const ( // iota被重设为0
c0 = iota // c0 == 0
c1 // c1 == 1
c2 // c2 == 2
)
const (
a = 1 <
定义:
枚举指一系列相关的常量,比如下面关于一个星期中每天的定义。
在go语言中,没有直接支持枚举的关键字,也就造成go没有直接枚举的功能。但是go提供另一种方法来实现枚举,那就是const+iota
package main
import "fmt"
//1.枚举的使用
// 枚举指一系列相关的常量,比如下面关于一个星期中每天的定义。通过上一节的例子,我们
// 看到可以用在 const 后跟一对圆括号的方式定义一组常量,这种定义法在Go语言中通常用于定义
// 枚举值。Go语言并不支持众多其他语言明确支持的 enum 关键字。
// 下面是一个常规的枚举表示法,其中定义了一系列整型常量:
const(
Sunday = iota //0
Monday //1
Tuesday //2
Wedenesday //3
Thursday //4
Friday //5
Saturday //6
//同Go语言的其他符号(symbol)一样,以大写字母开头的常量在包外可见。
//以上例子中 numberOfDays 为包内私有,其他符号则可被其他包访问。
numberOfDays
)
func main() {
fmt.Println("Sunday=",Sunday)
fmt.Println("Monday=",Monday)
fmt.Println("Tuesday=",Tuesday)
fmt.Println("Wedenesday=",Wedenesday)
fmt.Println("Thursday=",Thursday)
fmt.Println("Friday=",Friday)
fmt.Println("Saturday=",Saturday)
fmt.Println("numberOfDays=",numberOfDays)
}
运行结果:
PS D:\Go\GoWorkSpace\demo\index\ch1> go run main.go
Sunday= 0
Monday= 1
Tuesday= 2
Wedenesday= 3
Thursday= 4
Friday= 5
Saturday= 6
numberOfDays= 7