登录
首页 >  Golang >  Go问答

Golang通道不关闭

来源:stackoverflow

时间:2024-04-16 19:09:28 295浏览 收藏

各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题《Golang通道不关闭》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!

问题内容

我不明白,为什么频道没有关闭。 我使用 waitgroup 显式等待并关闭通道...但是程序没有退出。 谢谢您的帮助

(https://play.golang.org/p/lto2dytwh13)

package main

import (
    "fmt"
    "net/http"
    "sync"
)

var wg sync.WaitGroup

func main() {
    links := []string{
        "http://google.com",
        "http://facebook.com",
        "http://stackoverflow.com",
        "http://golang.org",
        "http://amazon.com",
    }
    wg.Add(len(links))
    c := make(chan string)

    for _, link := range links {
        go checkLink(link, c, &wg)
    }
    wg.Wait()
    close(c)
    for u := range c {
        fmt.Println(u)
    }
}

func checkLink(link string, c chan string, wg *sync.WaitGroup) {
    _, err := http.Get(link)
    if err != nil {
        fmt.Println(link, "might be down!")
        c <- link
        return
    }

    fmt.Println(link, "is up!")
    c <- link
    wg.Done()
}

解决方案


以下是您的程序存在的问题:

  • 当 goroutine 成功读取链接时,它会打印 is up! 消息,并开始等待写入通道。主 goroutine 等待所有 goroutine 退出,然后关闭通道并从中读取数据。此时,所有 goroutine 都处于睡眠状态。
  • 您正在关闭频道并从中读取内容。这将立即返回零值,即“”
  • 如果从链接读取失败,您的 goroutine 将返回而不调用 wg.done()

要修复,请使用:

go func() {
        wg.Wait()
        close(c)
    }()

终于介绍完啦!小伙伴们,这篇关于《Golang通道不关闭》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>