1、GO变量声明
本Go语言基础入门内容均来自于《Go语言编程》,个人记录,加深理解。
Go语言的变量声明方式和c/c++语言不同。Go语言引入了var关键字。变量声明如下:
var v1 int//声明一个整型变量v1 var v2 string var v3 [10]int //数组 var v4 []int//数组切片 var v5 struct { //结构体 f int } var v6 *int//指针 var v7 map[string] int//map,ley为string,value为int var v8 func(a int) int
可以看到,变量的声明没有以分号 ; 作为结束符
var关键字也可一次定义多个变量
<pre name="code" class="cpp">var (
v1 int
v2 string
)
2、变量初始化
var关键字在变量的定义是是可以省略的,如:
var v1 int = 10 // 正确的使用方式1 var v2 = 10 // 正确的使用方式2,编译器可以自动推导出 v2的类型 v3 := 10 // 正确的使用方式3,编译器可以自动推导出 v3的类型使用:= 可以减少代码的书写量,这对程序员来说是大大的好处啊
但在我们使用的过程中,不应该出现如下:
var i int i := 2这会导致编译错误,出现这样的错误:no new variables on left side of :=
3、变量赋值
<pre name="code" class="cpp" style="font-family: Courier;">var v10 int//先声明,再赋值 v10 = 123
i, j = 2, 3//Go支持多重赋值多重赋值最简单的好处就是,交换两数的值。如:
i, j = j, i
编译器会先计算等号右边的值,再为左边的赋值
4、匿名便量
Go语言支持多返回值和匿名变量
func GetName() (firstName, lastName, nickName string) { return "May", "Chan", "Chibi Maruko" }该函数返回3个 string 类型的变量
firstName, lastName, nickName我们可以在不新定义变量的情况下,直接返回 匿名变量。这样使我们的代码变得更加简洁,优雅
当然我们在接收函数返回的时候也可以选择性的接收参数
_, _, nickName := GetName()
5、常量
在Go语言中,常量是指编译期间就已知且不可改变的值。常量可以是数值类型(包括整型、浮点型和复数类型)、布尔类型、字符串类型等。
字面常量
字面常量
-12 3.14159265358979323846 // 浮点类型的常量 3.2+12i // 复数类型的常量 true // 布尔类型的常量 "foo" // 字符串常量常量定义
通过const关键字,定义常量:
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", 无类型整型和字符串常量如果常量在定义时没有限定类型,那么该常量 是一个 字面常量
常量定义的右值也可以是一个在编译期运算的常量表达式,如:
const mask = 1 << 3
由于常量的赋值是一个编译期行为,所以右值不能出现任何需要运行期才能得出结果的表达
式,比如试图以如下方式定义常量就会导致编译错误:
式,比如试图以如下方式定义常量就会导致编译错误:
const Home = os.GetEnv("HOME")原因很简单, os.GetEnv() 只有在运行期才能知道返回结果,在编译期并不能确定,所以
无法作为常量定义的右值。
预定义常量
Go语言预定义了这些常量: true、 false和iota。
iota比较特殊,可以被认为是一个可被编译器修改的常量,在每一个const关键字出现时被
重置为0,然后在下一个const出现之前,每出现一次iota,其所代表的数字会自动增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.0
w = 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 <<iota // a == 1 (iota在每个const开头被重设为 0) b // b == 2 c // c == 4 )
6、枚举
枚举指一系列相关的常量,比如下面关于一个星期中每天的定义。通过上一节的例子,我们
看到可以用在const后跟一对圆括号的方式定义一组常量,这种定义法在Go语言中通常用于定义
枚举值。 Go语言并不支持众多其他语言明确支持的enum关键字。
看到可以用在const后跟一对圆括号的方式定义一组常量,这种定义法在Go语言中通常用于定义
枚举值。 Go语言并不支持众多其他语言明确支持的enum关键字。
const ( Sunday = iota Monday Tuesday Wednesday Thursday Friday Saturday numberOfDays // 这个常量没有导出 )同Go语言的其他符号( symbol)一样,以大写字母开头的常量在包外可见。
以上例子中numberOfDays为包内私有,其他符号则可被其他包访问。
有疑问加站长微信联系(非本文作者)