channel 通道错误的使用例子
  dwHry2iKGG0I 2023年11月18日 54 0

1.向已经关闭的通道发送值,引起panic错误

package main

import "fmt"

func recv(c chan int) {
	ret := <-c
	fmt.Println("接收成功", ret)
}
func main() {
	ch := make(chan int)
	go recv(ch) // 启用goroutine从通道接收值
	ch <- 10
	close(ch)
	ch <- 9
	fmt.Println("发送成功")
}

2.首先向通道发送值,然后在启动接受通道值的协程,引起deadlock错误

  

package main

import "fmt"

func recv(c chan int) {
    ret := <-c
    fmt.Println("接收成功", ret)
}
func main() {
    ch := make(chan int)
    ch <- 10
    go recv(ch) // 启用goroutine从通道接收值

    fmt.Println("发送成功")
}

3.向没有接受者的无缓存的通道发送值,引起deadlock错误

package main

import "fmt"

func main() {
    ch := make(chan int)
    ch <- 10

    fmt.Println("发送成功")
}

4.关闭已经关闭的通道,引起panic错误

package main

import "fmt"

func recv(c chan int) {
    ret := <-c
    fmt.Println("接收成功", ret)
}
func main() {
    ch := make(chan int)
    go recv(ch) // 启用goroutine从通道接收值
    ch <- 10

    close(ch)
    close(ch)
    fmt.Println("发送成功")
}

 5.从未关闭的通道取值,引起deadlock错误

package main

import (
    "fmt"
    "sync"
)

func main() {
    ch := make(chan int, 10)
    for i := 1; i <= 10; i++ {
        ch <- i
    }

    // 遍历时,如果channel没有关闭,则会出现deadlock错误
    //close(ch) // 注释掉,不关闭

    // channel遍历
    fmt.Println("start...")
    wg := &sync.WaitGroup{}
    wg.Add(1)
    go func() {
        defer wg.Done()
        for v := range ch {
            fmt.Println("v: ", v) // 输出1、2后就会阻塞
        }

    }()
    wg.Wait()
    fmt.Println("end...")
}

 

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月18日 0

暂无评论

推荐阅读
  anLrwkgbyYZS   2023年12月30日   28   0   0 i++iosi++ioscici
dwHry2iKGG0I