GO 指南笔记

零值

常量

数值常量

const (
  Big   = 1 << 100
  Small = Big >> 99
)
func needInt(x int) int { return x*10 + 1 }
func main() {
  fmt.Println(needFloat(Big))
}

switch

defer

func main() {
  i := 1
  defer fmt.Println("world", i)

  i++
  fmt.Println("hello", i)
}

//hello 2
//world 1
func main() {
  fmt.Println("counting")

  for i := 0; i < 10; i++ {
    defer fmt.Println(i)
  }

  fmt.Println("done")
}

指针

结构体

数组

slice

对 slice 切片

b := make([]int, 0, 5) // len(b)=0, cap(b)=5

range

for 循环的 range 格式可以对 slice 或者 map 进行迭代循环

map

在 map m 中插入或修改一个元素: m[key] = elem 获得元素:elem = m[key] 删除元素:delete(m, key) 通过双赋值检测某个键存在:elem, ok = m[key]

函数

方法

有两个原因需要使用指针接收者。

type Vertex struct {
  X, Y float64
}

// 使用指针接收者,是为了避免在调用方法中拷贝值,其次是可以修改接受者指向的值
// 因为值类型可能是大的结构体,拷贝的话性能不好
// 如果 v 是一个值(非指针),方法看到的是 Vertex 的副本,并且无法修改原始值
func (v *Vertex) Abs() float64 { 
  return math.Sqrt(v.X*v.X + v.Y*v.Y) 
}

func main() {
  v := &Vertex{3, 4}
  fmt.Println(v.Abs())
}

接口

Stringers Stringer 是一个可以用字符串描述自己的类型。fmt包 (还有许多其他包)使用这个来进行输出。

type Stringer interface {
    String() string
}

错误

与 fmt.Stringer 类似, error 类型是一个内建接口:

type error interface {
    Error() string
}

Goroutine

goroutine 是由 Go 运行时环境管理的轻量级线程。

channel

缓冲 channel

  ch := make(chan int, 2)
  ch <- 1
  ch <- 2
  ch <- 3 //因为缓存区比填满,fatal error: all goroutines are asleep - deadlock!
  fmt.Println(<-ch)
  fmt.Println(<-ch)

range 和 close

 v, ok := <-ch
 for i := range c

注意事项

select