Golang信道(通道)编程详解(​看代码,看注释就懂了)

不废话,看代码,看注释就懂了。

package main
import (  "fmt")
// 定义信道整型变量 intChan 用于发送整型数值var intChan chan int
// 定义结构体type user struct {  Name     string  Password string}
type userinfo struct {  Name     string  Password string  sex      string}
func main() {  //创建一个容量为10的int类型缓冲信道,初始化用make()函数。  intChan = make(chan int, 10)  //将值3发送到信道  intChan <- 3  //打印信道的地址  fmt.Printf("信道 intChan 的地址是:%v\n", &intChan)  //未接收数据前,打印信道的大小(即有多少数据),用 len() 函数  fmt.Printf("信道 intChan 的大小是:%v\n", len(intChan))  //打印信道发送的值(数据),这里把数据接收了  fmt.Printf("信道 intChan 的数据是:%v\n", <-intChan)  //接收数据后,打印信道的大小(即有多少数据),用 len() 函数  fmt.Printf("信道 intChan 的大小是:%v\n", len(intChan))  //打印信道的容量,用 cap() 函数  fmt.Printf("信道 intChan 的容量是:%v\n", cap(intChan))
  //一步到位,创建并初始化信道  strChan := make(chan string, 6)  //先进先出原则,先发送张三,必先接收张三  strChan <- "张三"  var str = "王五"  strChan <- str
  fmt.Printf("信道 strChan 的大小是:%v\n", len(strChan))  fmt.Printf("信道 strChan 的容量是:%v\n", cap(strChan))  //先进先出原则:这里先接收张三  fmt.Printf("信道 strChan 的数据是:%v\n", <-strChan)  //先进先出原则:这里后接收王五  fmt.Printf("信道 strChan 的数据是:%v\n", <-strChan)
  //当超过信道的大小还继续接收信道里的数据时(即信道里没有数据了还继续接收),会报 fatal error: all goroutines are asleep - deadlock! 错误  //如下面这行,intChan 信道里的数据 1 已被上面一句取走了,再继续取就会报错。  //fmt.Printf("信道 intChan 的数据是:%v\n", <-intChan)
  //接下来使用map  //初始化一个 mapChan map健类型为int,值类型为string  mapChan := make(chan map[int]string, 6)  //定义两个map,并初始化  map1 := make(map[int]string, 3)  map2 := make(map[int]string, 3)
  //赋值  map1 = map[int]string{    0: "张",    1: "老",    2: "三",  }  map2 = map[int]string{0: "王", 1: "老", 2: "五"}
  //发送  mapChan <- map1  mapChan <- map2
  //接收并打印输出  fmt.Printf("%v\n%v\n", map1, map2)
  //使用结构体  //初始化 allChan 信道为空接口类型,空接口类型可以是任意类型  allChan := make(chan interface{}, 9)  //往 allChan 发送一个用户数据  allChan <- user{    Name:     "小六",    Password: "123456",  }
  allChan <- 3  allChan <- 6  allChan <- 9
  allChan <- "管理员是小六"
  type1 := <-allChan  fmt.Printf("%T\n", type1)  //打印出来是用户类型,但不能使用用户类型的任何属性和方法,如fmt.Printf("%T\n", type1.Password)是会报错的  //可以通过使用类型类断言来解决  u := type1.(user) //这句可以写成:u:=(<-allChan).(user) 效果一样  //类型断言后,就可以使用user的属性或方法了  fmt.Printf("用户名:%v\n密码是:%v\n", u.Name, u.Password)
  //打印  //fmt.Printf("%v\n%v\n%v\n%v\n%v\n", <-allChan, <-allChan, <-allChan, <-allChan, <-allChan)
  //使用for range方式遍历信道里的数据  userinfoChan := make(chan interface{}, 6)  userinfoChan <- user{    Name:     "老二",    Password: "123456",  }  userinfoChan <- userinfo{    Name:     "老大",    Password: "12345678",    sex:      "男",  }  //先关掉信道,用close函数,关闭后,不能往里面再写入(发送)数据了,否则会提示:panic:send on closed channel  close(userinfoChan)  //在close()函数关闭信道后,再用:userinfoChan <- 1 写入(发送)数据进去会报错  //遍历信道里的数据  for val := range userinfoChan {    fmt.Println(val)  }
  //使用简化for写法,把上面的for range注释掉才不会进入 if !ok,因为for range把信道里的数据都拿走了  for {    val, ok := <-userinfoChan    //判断信道里是否吸数据,if !ok表示没有,就用break跳出for循环    if !ok {      break    }    fmt.Println(val)  }
  //使用len()函数来判断userinfoChan的大小,结果会不正确,因为fmt.Println(<-userinfoChan)把数据从信道取走后,信道的大小len()会发生改变  // for i:=0;i<len(userinfoChan);i++{  //   fmt.Println(<-userinfoChan)  // }}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值