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代码的正确解析(译注:比如行末是标识符、整数、浮点数、虚数、字符或字符串文字、关键字break
、continue
、fallthrough
或return
中的一个、运算符和分隔符++
、--
、)
、]
或}
中的一个)。举个例子,函数的左括号{
必须和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