Go语言编程入门超级指南

2020-01-28 12:01:04王冬梅

    w, _ = br.ReadSlice(' ')
    fmt.Printf("%qn", w)
}

func testReadBytes() {
    r := strings.NewReader("ABC DEF GHI")
    br := bufio.NewReader(r)

    w, _ := br.ReadBytes(' ')
    fmt.Printf("%qn", w)

    w, _ = br.ReadSlice(' ')
    fmt.Printf("%qn", w)

    s, _ := br.ReadString(' ')
    fmt.Printf("%qn", s)
}

func testReadUnicode() {
    r := strings.NewReader("你好,世界!")
    br := bufio.NewReader(r)

    c, size, _ := br.ReadRune()
    fmt.Printf("read unicode=[%c], size=[%v]n", c, size)

    c, size, _ = br.ReadRune()
    fmt.Printf("read unicode=[%c], size=[%v]n", c, size)

    br.UnreadRune()
    c, size, _ = br.ReadRune()
    fmt.Printf("read(after undo) unicode=[%c], size=[%v]n", c, size)
}

func testWrite() {
    b := bytes.NewBuffer(make([]byte, 0))
    bw := bufio.NewWriter(b)

    fmt.Printf("Available: %dn", bw.Available())
    fmt.Printf("Buffered: %dn", bw.Buffered())

    bw.WriteString("ABCDEFGH")
    fmt.Printf("Available after write: %dn", bw.Available())
    fmt.Printf("Buffered after write: %dn", bw.Buffered())
    fmt.Printf("Buffer after write: %qn", b)

    bw.Flush()
    fmt.Printf("Available after flush: %dn", bw.Available())
    fmt.Printf("Buffered after flush: %dn", bw.Buffered())
    fmt.Printf("Buffer after flush: %qn", b)
}

func testWriteByte() {
    b := bytes.NewBuffer(make([]byte, 0))
    bw := bufio.NewWriter(b)

    bw.WriteByte('H')
    bw.WriteByte('e')
    bw.WriteByte('l')
    bw.WriteByte('l')
    bw.WriteByte('o')
    bw.WriteString(",")
    bw.WriteRune('世')
    bw.WriteRune('界')
    bw.WriteRune('!')
    bw.Flush()

    fmt.Println(b)
}

4.5 并发控制

sync包中的WaitGroup是个很有用的类,类似信号量。wg.Add()和Done()能够加减WaitGroup(信号量)的值,而Wait()会挂起当前线程直到信号量变为0。下面的例子用WaitGroup的值表示正在运行的goroutine数量。在goroutine中,用defer Done()确保goroutine正常或异常退出时,WaitGroup都能减一。

package main

import (