Go In Action

1. Golang 起源

GO 语言由 Google 于 2009 年 11 月开源,荣膺 TIOBE 2009,2016 年度语言。

主要贡献者为 Ken Thompson, Rob Pike, Robert Griesemer 等, 2012 年 3 月 release 1.0 版本, 最新版本 Go 1.8。

官网:https://golang.org/

Go 语言设计为系统语言,风格简单实用,兼顾性能和效率,基于 CSP 并发模型,原生协程( goroutine )处理, 并发能力卓越。

业界案例:Docker, Hyperledger, TiDB

2. 安装环境

Linux,Mac,Windows 等平台都有相应的安装包,安装完毕后设置 GOPATH 环境变量作为 workspace。

基础命令:

  1. go build 编译
  2. go run 运行
  3. go install 编译并复制到 bin 目录
  4. go get 安装依赖包
  5. go test 测试

3. 基础语法

规约:大小写约定权限,不用分号

基本类型:

  • 布尔型:bool
  • 整型:int int64 int32 int16 int8 uint8(byte) uint16 uint32 uint64 uint
  • 浮点型:float32 float64
  • 复数型:complex64 complex128
  • 字符串:string
  • 字符型:byte rune

复合类型:array, struct, function, interface, slice, map, channel

关键保留字 25 个:

  • var, const :变量和常量的声明
  • package, import: 包声明,包导入
  • func: 定义函数和方法
  • return: 从函数返回
  • defer:在函数退出之前执行
  • go : 用于并行
  • select: 用于选择不同类型的通讯
  • interface: 用于定义接口
  • struct: 用于定义抽象数据类型
  • break、case、continue、for、fallthrough、else、if、switch、goto、default: 流程控制
  • chan: 用于channel通讯
  • type: 用于声明自定义类型
  • map: 用于声明map类型数据
  • range: 用于读取slice、map、channel数据

内置函数:

  • new 分配零值内存 并返回指针
  • make 分配内存初始化结构 并返回对象
  • append
  • close
  • recover
  • panic
  • len
  • delete
  • copy

4. 实例

  • Hello World

    1
    2
    3
    4
    5
    6
    7
    package main
    import (
    "fmt"
    )
    func main() {
    fmt.Println("Hello,世界!")
    }
  • 变量定义

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    package main
    import (
    "fmt"
    )
    var(
    one int
    two string
    )
    func main() {
    one, two = 1,"2"
    three:= "2"
    fmt.Println(one, two, three )
    }
  • struct, func

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    package main
    import (
    "fmt"
    )
    type person struct{
    name string
    age int
    gender byte
    }
    func (p *person) getAge() int {
    return p.age
    }
    func (p *person) getNameAndAge() (string, int){
    return p.name, p.age
    }
    func main() {
    me := person{
    name: "Meng",
    age:18,
    gender: 0}
    wo:= new(person)
    wo.name = "Xi"
    wo.age = 20
    wo.gender = 1
    fmt.Println( me.getAge() )
    fmt.Println( wo.getNameAndAge() )
    }
  • array,slice

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    package main
    import (
    "fmt"
    )
    func main() {
    var array = [5]string{"1","2"}
    var slice_ []int = make([]int,5,10)
    fmt.Println(array)
    fmt.Println(slice_)
    slice_ = append(slice_,6)
    array[5]="6" //报错
    }
  • chan

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    package main
    import "fmt"
    func sum(values []int, resultChan chan int) {
    sum := 0
    for _, value := range values {
    sum += value
    }
    // 将计算结果发送到channel中
    resultChan <- sum
    }
    func main() {
    values := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    resultChan := make(chan int, 3)
    go sum(values[:len(values)/2], resultChan)
    go sum(values[len(values)/2:], resultChan)
    go sum(values[len(values)/3:], resultChan)
    sum1, sum2, sum3 := <-resultChan, <-resultChan, <-resultChan
    fmt.Println("Result:", sum1, sum2, sum3)
    }
  • Web Server

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    package main
    import (
    "io"
    "net/http"
    "log"
    )
    func HelloServer(w http.ResponseWriter, req *http.Request) {
    io.WriteString(w, "hello, world!\n")
    }
    func main() {
    http.HandleFunc("/hello", HelloServer)
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
    log.Fatal("ListenAndServe: ", err)
    }
    }

5. Beego Web Framework

Beego 官网