不废话,看代码,看注释就懂了。
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)
// }
}