时间过的好快,转眼端午已经过去两天半了,今天在家里,静下心,看看书,写写文章。这一段时间,我除了看Cowboy源码,抽空看了下Go的基本语法,当然就是看之前在Ubuntu下使用Sublime Text 2搭建Go开发环境 这篇文章中跟大家推荐的《学习Go语言》0.4 中文版,今天抽空整理下基础知识点,毕竟看跟实践带来的效果是不同的。
变量、类型和保留字
Go在语法上有着类C的感觉,一般情况下,你不需要使用分号,除非你将两个(或更多)语句放在一行书写。
Go和ActionScript3一样,变量的类型在变量名的后面,例如:
C#是: int a; 而Go则是 var a int; 如果一行只有一个语句,则;可以不加。
默认值:当定义了一个变量,则它的默认值为其类型的null值,例如:
package main import ( "fmt" ) func main() { // 例子1 var a int var b string fmt.Printf("a = %d\n", a) fmt.Printf("b = %s\n", b) }
运行结果如下:
从例子中,我们可以明白,在var a int后,a的值为0;var b string,意味着b被赋值为零长度的字符串,也就是""。
声明和赋值:在Go中,声明和赋值是两过程,但是可以连在一起,在Go中有两种方式,如下:
package main import ( "fmt" ) func main() { // 例子2 var x int x = 20 y := 20 fmt.Printf("x = %d\n", x) fmt.Printf("y = %d\n", y) // 例子3 var ( q int k bool ) q = 20 k = false // 例子4 //q, k := 20, false fmt.Printf("q = %d\n", q) fmt.Println("k =", k) }
运行结果如下:
我们看,例子2中,使用保留字 var 声明变量x,然后赋值20给它;而变量y,则使用另一种方式 := ,使得在一步内完成了声明和赋值(这一形式只能在函数内使用),这种情况下,变量的类型是由值推演出来的,值20表示是int类型,值false告诉Go它的类型应该是bool。:= 在函数外使用,也就是全局变量,会提示如下错误:
例子3是多个var声明可以一起完成;同样的例子4,则是多个变量,可以使用平行赋值。2个例子的结果是一致的。
特殊变量 _ ,任何赋给它的值都被丢弃,例子如下:
// 例子5 _, r := 34, 35 fmt.Printf("r = %d\n", r)
在这个例子中,将35赋值给r,同时丢弃34。
Go 的编译器对声明却未使用的变量在报错,测试如下:
布尔类型
布尔类型表示由预定义的常量 true 和 false 代表的布尔判定值。布尔类型是 bool。
数字类型
Go 有众所周知的类型如 int,这个类型根据你的硬件决定适当的长度。意味着在 32 位硬件上,是 32 位的;在 64 位硬件上是 64 位的。注意:int 是 32 或 64 位之一,不会定义成其他值。uint 情况相同。
如果你希望明确其长度,你可以使用 int32 或者 uint32。完整的整数类型列表(符号和无符号)是 int8,int16,int32,int64 和 byte,uint8,uint16,uint32,uint64。byte是 uint8 的别名。浮点类型的值有float32 和 float64 (没有 float 类型)。64 位的整数和浮点数总是 64 位的,即便是在 32 位的架构上。
例子如下:
// 例子5 _, r := 34, 35 fmt.Printf("r = %d\n", r) fmt.Println(reflect.TypeOf(r).Size())
很遗憾,这里输出的是 4。可是我机器是64位ubuntu,不是应该输出8吗?这里我使用的是 go build file.go 方式编译,会不会是编译问题,我尝试使用 6g 6l 方式编译:
可惜结果,依然是4,我又尝试了下,下面这个例子:
var a64 int64; fmt.Println(reflect.TypeOf(a64).Size())
这里输出的是 8。
这里我得出的结论是不管是32还是64位机器,int都是32位的,跟文档上的不同。
Go浮点类型的值有 float32 和 float64 (没有 float 类型),例子如下:
var o32 float32 o32 = 3.5 fmt.Println(reflect.TypeOf(o32).Size()) var o64 float64 o64 = 3.5 fmt.Println(reflect.TypeOf(o64).Size())
这里输出 4 和 8。
需要留意的是这些类型全部都是独立的,并且混合用这些类型向变量赋值会引起编译器错误:
最后,说明下,这篇文章,有大量摘抄自mikespook翻译的《学习Go语言》中文版的文字,因为都是基础的语法,所以建议大家看下这本电子书。
今天就先分享到这里,谢谢大家的耐心观看。
补充:
http://golang.org/doc/go_faq.html#q_int_sizes
关于 int 在 64位系统下,也是 4位的说明,上面是官方的FAQ。这边感谢@张景埕的帮助。