go chan 类型用法

  • 引用类型
  • 零值 nil
  • <发送/写>型 chan<-
  • <接收/读>型 <-chan
  • 双向型 chan
  • 构造/初始化 make()
  • 关闭 close()
  • 判等 ==
  • <发送/写>数据 chan <- send_date
  • <接收/读>数据 recv_data := <- chan
  • chan 关闭或有数据,读操作不阻塞
  • chan 未关闭且无数据,读操作阻塞

例子

package main

import "fmt"

func main() {

	//双向型 chan, 零值 nil
	var ch chan int
	//输入型 chan->
	var ci chan<- int
	//输出型 <-chan
	var co <-chan int
	//make()
	cc := make(chan int, 10)
	ch = cc
	//双向型赋值给单向型正确
	ci = ch
	co = ch
	//单向型赋值给双向型错误
	//ch = ci //❌
	//ch = co //❌
	fmt.Println(ci, co, ch) //0xc00008c000 0xc00008c000 0xc00008c000

	//可以赋值 -> 类型兼容 -> 可以判等
	b1 := ch == cc
	b2 := ci == nil
	b3 := ch == ci
	b4 := ch == co
	//不可以赋值 -> 类型不兼容 -> 不可以判等
	// b5 := ci == co //❌
	fmt.Println(ci, co, cc, ch) //0xc00008c000 0xc00008c000 0xc00008c000 0xc00008c00
	fmt.Println(b1, b2, b3, b4) //true false true true

	//chan 发送/写
	ch <- 1
	//chan 接收/读
	out := <-ch
	fmt.Println(out) // 1

	ch <- 1
	//close(), chan 关闭
	close(ch) //关闭后读操作不阻塞
	//chan 关闭后,还有数据.读操作,返回 数据 和 true
	out1, ok1 := <-ch
	//chan 关闭后,没有数据.读操作,返回 零值 和 false
	out2, ok2 := <-ch
	fmt.Println(out1, ok1, out2, ok2) // 1 true 0 fals

	ch = make(chan int, 0)
	//chan 没关闭,无数据,读操作阻塞
	out = <-ch

	fmt.Println("上一句阻塞了!!!打印不出这行了?!!!")

}

输出

0xc00008c000 0xc00008c000 0xc00008c000
0xc00008c000 0xc00008c000 0xc00008c000 0xc00008c000
true false true true
1
1 true 0 false
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:
main.main()
	i:/github.com/gkt_cc_go/src/example/chan/chan.go:68 +0x508
exit status 2

你可能感兴趣的:(go)