go 语言管道

go 语言管道

  • 有缓存,无缓冲管道,读,写,close测试
package main

import (
	"fmt"
	"time"
)

func main() {

	c := make(chan struct{}, 3)

	c <- struct{}{}
	fmt.Printf(" len(c) = %d\n", len(c))
	fmt.Printf(" cap(c) = %d\n", cap(c))
	c <- struct{}{}
	fmt.Printf(" len(c) = %d\n", len(c))
	fmt.Printf(" cap(c) = %d\n", cap(c))
	c <- struct{}{}
	fmt.Printf(" len(c) = %d\n", len(c))
	fmt.Printf(" cap(c) = %d\n", cap(c)) //cap(c)一直是3,len(c)当前管道里缓存的数量
	//c <- struct{}{} //有缓冲管道,管道满了就阻塞

	/*	var i int = 0
		for cc := range c { //遍历等价于<-c
			fmt.Printf("cc = %v\n", cc)
			if i == 1 {
				close(c) //在遍历时,如果channel没有关闭,则会出deadlock的错误
				//在遍历时,如果channel已经关闭,则会正常遍历管道的所以数据,遍历完后,就会退出遍历。
			}
			i++
		}*/

	close(c)
	_, ok := <-c
	fmt.Printf("ok=%v\n", ok) //管道里面的还存在数据,即使close管道,管道里面的数据还是可以正常读取
	_, ok = <-c
	fmt.Printf("ok=%v\n", ok)
	_, ok = <-c
	fmt.Printf("ok=%v\n", ok)
	_, ok = <-c
	fmt.Printf("ok=%v\n", ok) //管道里面的数据都读完,并且close管道,ok才是fasle

	//c <- struct{}{} 向已经关闭的管道里面写数据,报panic

	noBuffChan := make(chan struct{})
		go func() {
		time.Sleep(6 * time.Second)
		<-noBuffChan
	}()

/*	go func() {
		time.Sleep(6 * time.Second)
		close(noBuffChan)
	}()*/

	go func() {
		time.Sleep(3 * time.Second)
		noBuffChan <- struct{}{}
	}()
	<-noBuffChan //阻塞直到管道被关闭,或者管道里面有数据开始写
	fmt.Println("after <-noBuffChan")
	noBuffChan <- struct{}{} //阻塞直到管道开始读,如果阻塞过程中管道被关闭,则报panic
	fmt.Println("end")

}

你可能感兴趣的:(go语言,go)