Go语言编程入门超级指南

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

    go func() {
        channel <- "hello"
        // Sleep 10 sec
        time.Sleep(time.Second * 10)
        channel <- "world"
    }()

    for i := 0; i < 2; i++ {
        select {
            case msg := <- channel:
                fmt.Println("received message: " + msg)
            // Set timeout 5 sec
            case <- time.After(time.Second * 5):
                fmt.Println("Time out!")
        }
    }
}

func unblockChannel() {
    channel := make(chan string, 5)

    go func() {
        channel <- "hello"
        time.Sleep(time.Second * 10)
        channel <- "world"
    }()

    for i := 0; i < 15; i++ {
        select {
            case msg := <- channel:
                fmt.Println("received message: " + msg)
            default:
                fmt.Println("Nothing received!")
                time.Sleep(time.Second)
        }
    }
}

4.4 缓冲流

Golang的bufio包提供了方便的缓冲流操作,通过strings或网络IO得到流后,用bufio.NewReader/Writer()包装:

缓冲区:Peek()或Read时,数据会从底层进入到缓冲区。缓冲区默认大小为4096字节。
切片和拷贝:Peek()和ReadSlice()得到的都是切片(缓冲区数据的引用)而不是拷贝,所以更加节约空间。但是当缓冲区数据变化时,切片也会随之变化。而ReadBytes/String()得到的都是数据的拷贝,可以放心使用。
Unicode支持:ReadRune()可以直接读取Unicode字符。有意思的是Golang中Unicode字符也要用单引号,这点与Java不同。
分隔符:ReadSlice/Bytes/String()得到的包含分隔符,bufio不会自动去掉。
Writer:对应地,Writer提供了WriteBytes/String/Rune。