代码改变世界

Go基础语法整理(一)

2012-06-24 15:10  rhinovirus  阅读(12259)  评论(7编辑  收藏  举报

  时间过的好快,转眼端午已经过去两天半了,今天在家里,静下心,看看书,写写文章。这一段时间,我除了看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。这边感谢@张景埕的帮助。