1.1
1) Go语言的代码是通过package来组织的,一个package会包含一个或多个.go结束的源代码文件。
2) 每一个源文件都是以一个package xxx的声明语句开头的。
3) 每一个源文件都会import多个用到的package。
4) package main是一个比较特殊的package, 这个package里会定义一个独立的程序,这个程序是可以运行的,而不是像其它package一样对应一个library。在main这个package里,main函数也是一个特殊的函数,这是我们整个程序的入口。
5) 不需要分号作为语句或者声明结束,会自动添加,除非要在一行中将多个语句、声明隔开。
6) 原生支持Unicode标准,源文件格式为utf-8,变量也可以声明为非ascii,比如可以为中文。
7) 工具链
直接运行一个或多个文件,不保存编译结果。
$ go run helloworld.go
编译运行一个或多个文件,保存编译结果。
$ go build helloworld.go
获取其他仓库的代码
$ go get gopl.io/ch1/helloworld
需要预先按照版本管理工具,如git,且设置GOPATH环境变量,下载的代码会放在 $GOPATH/src/gopl.io/ch1/helloworld 目录
gofmt自动格式化
很多文本编辑器都可以设置为保存文件时自动执行gofmt,所以你的源代码应该总是会被格式化。
goimports
goimports会自动地添加你代码里需要用到的import声明以及需要移除的import声明。这个工具并没有包含在标准的分发包中,然而你可以自行安装:
$ go get golang.org/x/tools/cmd/goimports
1.2
1)os.Args的第一个元素,即os.Args[0]是命令行执行时的命令本身;其它的元素则是执行该命令时传给这个程序的参数。
2)切片s[m:n],左闭右开,m和n均可省略,相应替代为0或len(s)
3) 注释
单行注释以//来表示。
多行注释以/* */来表示。
4)++、--只支持后置,且是语句,不是表达式
5)var关键字用来声明变量。可以声明时初始化,若没有,则初始化为对应类型的0值。
用:=符号来给i进行初始化和赋值,这是var xxx=yyy的一种简写形式,只能用在函数中
6)变量的四种写法
s := ""
var s string
var s = ""
var s string = ""
那么这些等价的形式应该怎么做选择呢?这里提供一些建议:
第一种形式,只能用在一个函数内部,而package级别的变量不应该这么做。
第二种形式依赖于string类型的内部初始化机制,被初始化为空字符串。
第三种形式使用得很少,除非同时声明多个变量。
第四种形式会显式地标明变量的类型,在多变量同时声明时可以用到。
实践中你应该只使用上面的前两种形式,显式地指定变量的类型,让编译器自己去初始化其值,或者直接用隐式初始化,表明初始值怎么样并不重要。
7)特殊变量下划线_,表示忽略这个值
8)for的几种形式
// normal
for initialization; condition; post {
// zero or more statements
}
// a traditional "while" loop
for condition {
// ...
}
// a traditional infinite loop
for {
// ...
}
// range
for k,v := range os.Args[1:] {
}
在无限循环中,你还是可以靠break或者return语句来终止掉循环。
continue跳过当前循环
1.3
1)map是Go语言内置的key/value型数据结构。key支持任意数据类型,只要该类型能够用==运算符来进行比较。对map进行range循环时,其迭代顺序是不确定的。
2)fmt.Printf常用参数
%d int变量
%x, %o, %b 分别为16进制,8进制,2进制形式的int
%f, %g, %e 浮点数: 3.141593 3.141592653589793 3.141593e+00
%t 布尔变量:true 或 false
%c rune (Unicode码点),Go语言里特有的Unicode字符类型
%s string
%q 带双引号的字符串 "abc" 或 带单引号的 rune 'c'
%v 会将任意变量以易读的形式打印出来
%T 打印变量的类型
%% 字符型百分比标志(%符号本身,没有其他操作)
3)函数和包级别的变量可以以任意的顺序被声明,并不影响其被调用。
4)io操作
在更底层一些的地方,bufio.Scanner,ioutil.ReadFile和ioutil.WriteFile使用的都是*os.File的Read和Write方法,不过一般程序员并不需要去直接了解到其底层实现细节,在bufio和io/ioutil包中提供的方法已经足够好用。
1.4
1)当我们import了一个包路径包含有多个单词的package时,比如image/color(image和color两个单词),通常我们只需要用最后那个单词表示这个包就可以,比如color。
1.6
1)goroutine
goroutine是一种函数的并发执行方式,而channel是用来在goroutine之间进行参数传递。
main函数也是运行在一个goroutine中,而go function则表示创建一个新的goroutine,并在这个这个新的goroutine里执行这个函数。
2)channel
当一个goroutine尝试在一个channel上做send或者receive操作时,这个goroutine会阻塞在调用处,直到另一个goroutine往这个channel里写入、或者接收了值。
有疑问加站长微信联系(非本文作者)