chan可以被关闭,尽管它们和文件不同,不必每次都关闭

package main

import (
	"fmt"
	"time"
)

func main() {
	ch := make(chan string)
	go sendData(ch)
	go getData(ch)
	time.Sleep(1e9)
}
func sendData(ch chan string) {
	ch <- "北京"
	ch <- "上海"
	ch <- "广州"
	ch <- "武汉"
	ch <- "乌海"
}
func getData(ch chan string) {
	var input string
	for {
		input = <-ch
		fmt.Printf("%s", input)
	}
}

如何在通道的sendData()完成的时候发送一个信号,getData()又如何检测到通道是否关闭或者阻塞

  第一种方法可以通过函数close(ch)来完成,将这个通道标记为无法通过发送操作接收更多的值;给已关闭的通道发送或者再次关闭都会导致painc。

ch  :=make(chan  float64)  defer  close(ch