1、入门

1.1 hello world

package main

import "fmt"

func main(){
  fmt.Println("hello world")
}

Go语言的代码通过(package)组织,包类似于其它语言里的库(libraries)或者模块(modules)。一个包由位于单个目录下的一个或多个.go源代码文件组成,目录定义包的作用。每个源文件都以一条package声明语句开始,这个例子里就是package main,表示该文件属于哪个包,紧跟着一系列导入(import)的包,之后是存储在这个文件里的程序语句。

main包比较特殊。它定义了一个独立可执行的程序,而不是一个库。在main里的main 函数 也很特殊,它是整个程序执行时的入口(译注:C系语言差不多都这样)。main函数所做的事情就是程序做的。当然了,main函数一般调用其它包里的函数完成很多工作(如:fmt.Println)。

Go语言不需要在语句或者声明的末尾添加分号,除非一行上有多条语句。实际上,编译器会主动把特定符号后的换行符转换为分号,因此换行符添加的位置会影响Go代码的正确解析(译注:比如行末是标识符、整数、浮点数、虚数、字符或字符串文字、关键字breakcontinuefallthroughreturn中的一个、运算符和分隔符++--)]}中的一个)。举个例子,函数的左括号{必须和func函数声明在同一行上,且位于末尾,不能独占一行,而在表达式x + y中,可在+后换行,不能在+前换行(译注:以+结尾的话不会被插入分号分隔符,但是以x结尾的话则会被分号分隔符,从而导致编译错误)。

1.2 命令行参数

os包以跨平台的方式,提供了一些与操作系统交互的函数和变量。程序的命令行参数可从os包的Args变量获取;os包外部使用os.Args访问该变量。

os.Args变量是一个字符串(string)的切片(slice)。

os.Args的第一个元素:os.Args[0],是命令本身的名字;其它的元素则是程序启动时传给它的参数。

package main

import (
    "fmt"
    "os"
)

func main() {
    var s, sep string
    //for i:=1; i < len(os.Args); i++{
    for i, _ := range os.Args{
        //if i == 1{
        //  continue
        //}
        s += sep + os.Args[i]
        sep = "_"
    }
    fmt.Println(s)
}

build一下然后运行:

// build
go build main.go

// 运行
./main whw 666
// 结果
./main_whw_666

1.3 查找重复的行

*对文件做拷贝、打印、搜索、排序、统计或类似事情的程序都有一个差不多的程序结构:一个处理输入的循环,在每个元素上执行计算处理,在处理的同时或最后产生输出。

版本1

dup的第一个版本打印标准输入中多次出现的行,以重复次数开头。该程序将引入if语句,map数据类型以及bufio包:

package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
)

func main() {
    counts := make(map[string]int)
  // 持续接收终端输入的数据
    input := bufio.NewScanner(os.Stdin)
    for input.Scan() {
        if strings.ToUpper(input.Text()) == "Q" {
            break
        }
        // 等价于下面的语句:
        /*
            line := input.Text()
            counts[line] = counts[line] + 1
        */
        counts[input.Text()]++
    }
    fmt.Println("counts: ", counts)
    // NOTE: ignoring potential errors from input.Err()
    for line, n := range counts {
        fmt.Printf("%d(个)%s \n", n, line)

    }
}
执行过程及结果如下:
go run main.go
123
www
www
222
q // 输入q时打印结果
counts:  map[123:1 222:1 www:2]
1(个)123 
2(个)www 
1(个)222 

1.4 GIF动画

(略)

1.5 获取URL

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
    "os"
)

func main() {

    for _, url := range os.Args[1:] {
        resp, err := http.Get(url)
        if err != nil {
            fmt.Fprintf(os.Stderr, "fetch: %v\n", err)
            os.Exit(1)
        }
        b, err := ioutil.ReadAll(resp.Body)
        defer resp.Body.Close()
        if err != nil {
            fmt.Fprintf(os.Stderr, "fetch: reading %s: %v \n", url, err)
            os.Exit(1)
        }
        fmt.Println("b>>> ", b)
    }
}

build及执行:

// build
go build main.go
// excute (结果太多,略)
./main https://www.baidu.com https://www.google.hk

1.6 并发获取多个URL

Previous