zoukankan      html  css  js  c++  java
  • Go基础语法整理(一)

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

     
    分类: Go
  • 相关阅读:
    java并发编程(五)lock
    java并发编程(一)线程状态 & 线程中断 & 线程间的协作
    java基础之 clone
    java基础 小知识点汇总篇
    java并发编程(四) 线程池 & 任务执行、终止源码分析
    GC(一)内存管理与垃圾回收
    java并发编程(三)cpu cache & 缓存一致性
    java并发编程(八) CAS & Unsafe & atomic
    @PathVariable注解
    redis分布式锁
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2560585.html
Copyright © 2011-2022 走看看