go tour可以运行在本地,但是因为我一般都是用vscode remote 而且运行
go get golang.org/x/tour
的时候提示 connection refused,所以还是在网页上做,这里会记录一些值得留意的东西:
热身
- 在线版go tour是建立在go playground上的,有一些特别之处:他的时间总是从2009-11-10 23:00:00 UTC开始,而且对执行时间,以及cpu和内存的使用有一些限制,并且不能访问外部网络主机(那爬虫?)
- 在线版go tour的运行环境是确定的(恒定?),所以每次rand.intn都会返回同样的数(当然不是指每一个rand.Intn返回的结果都相同:
如:
fmt.Println("My favorite number is", rand.Intn(10),rand.Intn(10))
每次都会输入1,7
基础
- 每个go程序由一系列包组织而成
- 程序从名为main的包开始运行
- 在import语句中,import path中的最后一个元素是包的名字,例如math/rand,rand是包的名字(那math呢?是包嘛?)
- 引进包时,既可以所有包放在一个小括号里,也可以每个包一个import,但是推荐前一种
- go中,如果一个变量(常量?)以大写字母开头,那么他是导出的,即该变量所在的包被引用时,该变量可以被使用,如果不是大写字母开头,就不是导出的
- go中定义函数的风格:
func add(x int, y int) int {
return x + y
}
关于为什么类型在后面:https://blog.golang.org/declaration-syntax(TOREAD)
- 函数形参中,如果有两个或两个以上的类型相同,可以只写最后一个的类型
- go中函数可以返回任意数量的返回值
- go的返回值可以是有名字的,这些命名了的返回值是作为函数内的顶级变量,对返回值的明明应该反映其含义,如果return语句后面没有参数,那么就是返回命名了的返回值,但这种做法近应该在短小的函数中使用,因为这种做法会影响可读性
- var语句可以声明一系列变量,同样,类型在最后,var可以在函数内(function level),也可以在函数外(package level)
- var可以同时初始化变量,每个变量一个初始化的值,如果提供了初始化值,那么可以省略类型,go会使用初始化值的类型作为变量的类型,但也可以不忽略,如:
var a int =1
- 在函数内,可以用:=声明并初始化变量,同样的,从初始化值的类型推断变量类型,但在函数外,任何语句都需要以关键字开头,因此不能用短变量声明:=
- go的基本数据类型:并且printf时,%T可以输出类型,%v可以输出值(任何类型?);并且官方推荐除非有特殊需要,否则使用int,而不是int64/int32,int类型在32/64位上分别是32/64
bool
string
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptrbyte // alias for uint8
rune // alias for int32
// represents a Unicode code pointfloat32 float64
complex64 complex128
- 没有初始化的变量被赋予该类型的零值,boolean是false,string是""(空串)
- 和c一样,可以使用type(v)进行类型转换,但是必须是显式的类型转换
- 用const语句定义常量
控制流
- go只有一个循环语句:for,for不需要小括号, 但是永远需要大括号。同样,for的三个部分都是可选的
for i := 0; i < 10; i++ {
sum += i
}
- 用for实现while,就是只取中间的部分,此时可以不要左右的分号(md死循环机器差点卡死
- if和for一样,不需要小括号,但是必须要大括号
- 同样,if里也可以用一个:=声明一个局部变量,作用域只存在于if内
- go中的switch,只运行匹配的case,不进行fall through,并且case不需要是常量,也不需要是integer
- switch 后面可以不接变量,如:
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("Good morning!")
case t.Hour() < 17: