Go学习杂记

  1. 方法
    方法实际上也是函数,只是在声明时,关键字func喝方法名之间增加了一个参数(接收者)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    type user struct {
    name string
    email string
    }
    func (u user) notify() {
    fmt.Printf("Sending User Email To %s<%s>\n",u.name,u.email)
    }
    func (u *user) changeEmail(email string) {
    u.email = email
    }
  2. defer 关键字
    在函数或方法中,用defer标识的语句将会在函数或方法返回后执行
    1
    2
    3
    4
    5
    6
    7
    8
    9
    func (p *Pool) Release(r io.Closer) {
    p.m.Lock()
    defer p.m.Unlock()

    if p.closed {
    r.Close()
    return
    }
    }
  3. chan 通道
    1
    2
    3
    4
    5
    6
    7
    type Test struct {
    // 普通通道.
    complete chan error

    // 单项通道,只能读取.
    timeout <-chan time.Time
    }
  4. select 语句
    select 中没有default分支,程序将会阻塞等待
    1
    2
    3
    4
    5
    6
    7
    select {
    case err := <-r.complete:
    return err

    case <-r.timeout:
    return ErrTimeout
    }
    select 中有default分支,程序将会将阻塞转变为非阻塞,如果通道有内容则接收,没有则执行default分支
    1
    2
    3
    4
    5
    6
    7
    8
    select {
    case <-r.interrupt:
    signal.Stop(r.interrupt)
    return true

    default:
    return false
    }