《Go语言程序设计》中第8.10节有个聊天室的例子,我们就来跟着完成这个例子。
先来看看主函数:
func main() {
listener, err := net.Listen("tcp", "localhost:8000")
if err != nil {
//log.Fatal()打印错误信息并调用os.Exit(1),终止程序
log.Fatal(err)
}
//广播,发送消息到所有客户端
go broadcaster()
for {
conn, err := listener.Accept()
if err != nil {
log.Println(err)
continue
}
go handleConn(conn)
}
}
下面是broadcaster()相关代码:
//channel的三种类型(只发送、只接受、即发送也接受)
//这里client只发送不接受
//只接受 type client <-chan string
//即发送也接受 type client chan string
type client chan<- string
var (
entering = make(chan client)
leaving = make(chan client)
message = make(chan string)
)
func broadcaster() {
clients := make(map[client]bool)
for {
select {
case msg := <-message:
for cli := range clients {
cli <- msg