一. 基本概念

Go是一门编译型语言,Go语言的工具链将源代码及其依赖转换成计算机的机器指令(静态编译)。Go语言提供的工具都通过一个单独的命令go调用,go命令有一系列子命令。最简单的一个子命令就是run。这个命令编译一个或多个以.go结尾的源文件,链接库文件,并运行最终生成的可执行文件。

1
2
3
4
5
6
7
package main

import "fmt"

func main() {
fmt.Println("Hello, 世界")
}
1
go run helloworld.go // 运行指令

go build helloworld.go 这个命令生成一个名为helloworld的可执行的二进制文件(译注:Windows系统下生成的可执行文件是helloworld.exe,增加了.exe后缀名),之后你可以随时运行它(译注:在Windows系统下在命令行直接输入helloworld.exe命令运行),不需任何处理(译注:因为静态编译,所以不用担心在系统库更新的时候冲突,幸福感满满)。

1
go build helloworld.go 

Go的标准库提供了100多个包,以支持常见功能,如输入、输出、排序以及文本处理。比如fmt包,就含有格式化输出、接收输入的函数。Println是其中一个基础函数,可以打印以空格间隔的一个或多个值,并在最后添加一个换行符,从而输出一整行。main包比较特殊。它定义了一个独立可执行的程序,而不是一个库。在main里的main 函数 也很特殊,它是整个程序执行时的入口(译注:C系语言差不多都这样)。main函数所做的事情就是程序做的。当然了,main函数一般调用其它包里的函数完成很多工作(如:fmt.Println)。

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
28
29
30
31
32
33
34
35
36
37
38
package main

import (
"fmt"
"os"
"strings"
"time"
)

func main() {
var s, step string

os.Args = []string{"echo", "1", "2", "3"}

for i := 0; i < len(os.Args); i++ {
s += step + os.Args[i]
step = " "
}

fmt.Println(s, "\n", len(os.Args), os.Args)

fmt.Println("--------------------range-----------------------------")

startTime := time.Now()
for _, v := range os.Args[0:] {
s += step + v
step = " "
}
endTime := time.Now()
fmt.Println("时间:", endTime.Sub(startTime), s) // 1 2 3

fmt.Println("--------------------join-----------------------------")
start := time.Now()
join := strings.Join(os.Args[0:], ",") // 1 2 3
end := time.Now()
fmt.Println(end.Sub(start).Nanoseconds(), join)
}

二.变量声明方式

1
2
3
4
s := ""
var s string
var s = ""
var s string = ""

第一种形式,是一条短变量声明,最简洁,但只能用在函数内部,而不能用于包变量。第二种形式依赖于字符串的默认初始化零值机制,被初始化为””。第三种形式用得很少,除非同时声明多个变量。第四种形式显式地标明变量的类型,当变量类型与初值类型相同时,类型冗余,但如果两者类型不同,变量类型就必须了。实践中一般使用前两种形式中的某个,初始值重要的话就显式地指定变量的类型,否则使用隐式初始化。

三. 查找重复行