本系列针对有编程基础的人,学过c,c++,c#或php之类。
官网(英文的): https://golang.org/
找到个中文的:http://docscn.studygolang.com/doc/ 。
第一步可以通过https://tour.golang.org/welcome/1 快速的了解golang的大致特点,这个网页可以一边看概要文档,一边练习。
第二步可以看 http://docscn.studygolang.com/doc/code.html ,了解go代码的组织方式。
第三步 effective go,写出高效的golang http://docscn.studygolang.com/doc/effective_go.html
golang与其它语言不同的地方:
- 在 package或struct中,如果一个名字以大写字母开头,那么它就是已导出的。
- 声明 x int, y int 可以写成x, y int,当连续两个或多个函数的已命名形参类型相同时,除最后一个类型以外,其它都可以省略。
- 函数的多值返回 func swap(x, y string) (string, string) {。
- 命名返回值 func split(sum int) (x, y int) {
- 基本类型:bool/string/int int8 int16 int32 int64/uint uint8 uint16 uint32 uint64 uintptr/byte(uint8 的别名)/rune(int32 的别名,表示一个 Unicode 码点)/float32 float64/complex64 complex128
- 零值/默认值:数值类型为 0,布尔类型为 false,字符串为 ""(空字符串),指针nil。
- 与 C 不同的是,Go 在不同类型的项之间赋值时需要显式转换T(v)。
- for init; condition; post { }
for condition { }
for { }
for key, value := range varMap {
for pos, char := range "测试\x80語" { fmt.Printf("character %#U starts at byte position %d\n", char, pos)}
for i, j := 0, len(a)-1; i < j; i, j = i+1, j-1 {a[i], a[j] = a[j], a[i]} - switch:switch somevar.(type), switch no condition for fi else if, switch case multi value 与逗号分隔。
- defer 语句会将函数推迟到外层函数返回之后执行,资源管理。
- 指针, *type, &value, pointer get member value,用 . ,不用->
- type Vertex struct {
- 数组var a [10]int
- 切片就像数组的引用,切片并不存储任何数据,它只是描述了底层数组中的一段。更改切片的元素会修改其底层数组中对应的元素。与它共享底层数组的切片都会观测到这些修改。切片文法类似于没有长度的数组文法。切片
s
的长度和容量可通过表达式len(s)
和cap(s)
来获取。nil 切片的长度和容量为 0 且没有底层数组。func append(s []T, vs ...T) []T - Range.for 循环的 range 形式可遍历切片或映射。当使用 for循环遍历切片时,每次迭代都会返回两个值。第一个值为当前元素的下标,第二个值为该下标所对应元素的一份副本。
- 映射m = make(map[string]Vertex)。插入、修改m[key] = elem。删除delete(m, key)。elem, ok := m[key],ok为bool值,表示是否存在。
- 函数也是值。它们可以像其它值一样传递。函数值可以用作函数的参数或返回值。Go函数可以是一个闭包(与lua相似)。闭包是一个函数值,它引用了其函数体之外的变量。该函数可以访问并赋予其引用的变量的值,换句话说,该函数被这些变量“绑定”在一起。