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 (









