变量声明
Go中使用全新的关键字var来声明变量。var我们并不陌生,在Javascript 和C#中均有出现。不同的是Go和C#中变量属于强类型,在声明变量后就不允许改变其数据类型。
声明变量有多种形态:
|
|
变量初始化
变量的初始化工作可以在声明变量时进行初始化,也可以先声明后初始化。此时var关键字不再是必须的。
初始化变量有多种方式,每种方式有不同的使用场景:
在方法中声明一个临时变量并赋初值
|
|
全局中已声明变量直接赋值
|
|
我们看到有此两种方式:
var name [type] = value
如果不书写 type ,则在编译时会根据value自动推导其类型。
name := value
这里省略了关键字var,我很喜欢这种方式(可以少写代码,而没有任何坏处)。 但这有需要注意的是“ :=” 是在声明和初始化变量,因此该变量必须是第一次出现,如下初始化是错误的。但是要注意赋值时要确定你想要的类型,在Go中不支持隐式转换的。如果是定义个float64类型的变量,请写为 v1 :=8.0
而不是v1 :=8
。
|
|
NODE:我刚开始时老出现这种错误,一直将 “:= ” 当作 一般赋值语句处理
思考问题
初始化语句,在编译器上是如何进行自动类型推导的。一些字面常量是如何归类的?
如 8 → int , 8.0 → float64
|
|
官方文档: http://golang.org/ref/spec#Constant_expressions
|
|
————————2013-04-14补充—————————————-
|
|
在C#中会编译不通过,而Go语言中却是可行的,这是为什么呢?我在golang-chang中向大家请教了该问题,谢谢帮助我的人。
https://groups.google.com/forum/?fromgroups=#!topic/golang-china/k1UOr_1K_yw
将结果整理给大家:
- Go里面不损失精度的情况下会把8.0这类浮点数视作整数8
- Go里面的常数是高精度数,分为几类:
- 有类型的:uint(8),类型显式指定了,在表达式里面不会变化。
- 无类型的:分成无类型整数和无类型浮点两类。这两类在使用的时候会根据上下文需要的类型转化为实际类型, 比如uint8(0) + 1.0就是uint8(1),但是uint8(0)+1.2就会由于1.2无法转化为uint8而报错。 如果上下文无法确定(比如 i, j := 1, 2.0这样的),那么整数无类型常数转化为int,浮点数无类型常数转化为float64.
具体规则参见: http://tip.golang.org/ref/spec#Constant_expressions
————- 2013-04-14 end————————————————