**
channel
**
定义channel
a := make(chan int)//无缓冲
a := make(chan int,10)//有缓冲
func main() {
ints := make(chan Stu, 0)
stu := Stu{
Name: "132",
}
ints <- stu
var v1 Stu
v1 = <-ints
fmt.Println(v1) //{123}
}
报错,应该主线程已经结束,make 后面的数值要大于2,单线程情况下
像管道发送/接收值
int类型
func main() {
ints := make(chan int)
go func() {
ints<-666
}()
var v1 int
v1 = <-ints
fmt.Println(v1)//666
}
结构体
func main() {
ints := make(chan *Stu)
go func() {
s := new(Stu)
s.Name="123"
ints<- s
}()
var v1 *Stu
v1 = <-ints
fmt.Println(v1)//&{123}
}
new(type)返回的是指针类型
type Stu struct {
Name string
}
func main() {
ints := make(chan Stu, 1)
s := new(Stu)
s.Name="123"
ints <- *s
var v1 Stu
v1 = <-ints
fmt.Println(v1) //{123}
}
不使用new
func main() {
ints := make(chan Stu, 1)
stu := Stu{
Name: "132",
}
ints <- stu
var v1 Stu
v1 = <-ints
fmt.Println(v1) //{123}
}
通过判断管道关闭继续后续业务
func main() {
m1 := make(chan int)
go func() {
for i := 0; i < 10; i++ {
fmt.Println("fasong-----", i)
m1 <- i
}
close(m1)
}()
//time.Sleep(2 * time.Second)
for {
for i := 0; i < 10; i++ {
if m2, ok := <-m1; ok {
fmt.Println("jieshou---------", m2)
//todo
} else {
break //不跳出循环 主程序不会结束
}
}
}
fmt.Println("main 结束")
}
遍历管道
func main() {
m1 := make(chan int)
go func() {
for i := 0; i < 10; i++ {
fmt.Println("fasong-----", i)
m1 <- i
}
close(m1)
}()
for i := range m1 {
fmt.Println(i)
}
}