为什么传递到通道的值没有被fmt.Println打印出来? func main(){ 链接:=[]字符串{ "http://google.com", "http://amazon.com", "http://golang.org", "http://yahoo.com", "http://ebay.com", } c:=制造(成串) 对于_,链接:=范围链接{ testRequest(链接,c) } msg:=

为什么传递到通道的值没有被fmt.Println打印出来? func main(){ 链接:=[]字符串{ "http://google.com", "http://amazon.com", "http://golang.org", "http://yahoo.com", "http://ebay.com", } c:=制造(成串) 对于_,链接:=范围链接{ testRequest(链接,c) } msg:=,go,pointers,channel,Go,Pointers,Channel,您的程序在for第一个循环后被卡住,发送方尝试发送到频道,但接收方只有在循环完成后才能接收 func main() { links := []string{ "http://google.com", "http://amazon.com", "http://golang.org", "http://yahoo.com", &quo

您的程序在for第一个循环后被卡住,发送方尝试发送到频道,但接收方只有在循环完成后才能接收

func main() {
    links := []string{
        "http://google.com",
        "http://amazon.com",
        "http://golang.org",
        "http://yahoo.com",
        "http://ebay.com",
    }

    c := make(chan string)

    for _, link := range links {
        testRequest(link, c)
    }
    msg := <-c
    fmt.Println(msg)
}
func testRequest(s string, c chan string) {
    _, err := http.Get(s)
    if err != nil {
        fmt.Println(s, "Is down presently")
        c <- "Something might be down"
        return
    }
    fmt.Println(s, "Is working perfectly")
    c <- "Working great!"
}

对于无缓冲通道,写入testRequests()将在您从main()中的通道读取之前被阻止。您已处于死锁状态。通常您应该会收到错误,通常会找出所有Goroutine何时被阻止。不确定为什么不被阻止

您可能希望在不同的goroutine中运行testRequests():

func main() {
    links := []string{
        "http://google.com",
        "http://amazon.com",
        "http://yahoo.com",
        "http://ebay.com",
    }

    c := make(chan string)

    // This code will not blocks
    go func() {
        for _, link := range links {
            testRequest(link, c)
        }
    }()

    // Above code doesn't block, this code can excutes
    for {
        msg := <-c
        fmt.Println(msg)
    }
}

func testRequest(s string, c chan string) {
    _, err := http.Get(s)
    if err != nil {
        fmt.Println(s, "Is down presently")
        c <- "Something might be down"
        return
    }
    fmt.Println(s, "Is working perfectly")
    c <- "Working great!"
}
主程序包
进口(
“fmt”
“net/http”
)
func main(){
链接:=[]字符串{
"http://google.com",
"http://amazon.com",
"http://golang.org",
"http://yahoo.com",
"http://ebay.com",
}
c:=制造(成串)
go func(){
对于_,链接:=范围链接{
testRequest(链接,c)
}
关闭(c)
}()
对于msg:=范围c{
fmt.Println(味精)
}
fmt.Println(“完成处理请求”)
}
func testRequest(s字符串、c字符串){
_,err:=http.Get
如果错误!=零{
fmt.Println(s,“目前已关闭”)

c这里的问题是程序没有退出,也没有打印@MuffinTopOops频道的值,这是错误的。程序在发送到频道
c
时会阻塞。在发送方和接收方准备就绪之前,无缓冲频道
c
上的通信不会继续。所有发送都会在单个接收之前执行。当您在HTTP请求中,HTTP传输为内务管理任务创建一个或两个goroutine(通常处于休眠状态,但不是无休止地阻塞),这就足以让死锁检测器相信一切正常。它远不是万无一失的:)啊,这很有道理。我看到它的地方很恐慌,我没有任何http请求。谢谢@hobbs!
func main() {
    links := []string{
        "http://google.com",
        "http://amazon.com",
        "http://yahoo.com",
        "http://ebay.com",
    }

    c := make(chan string)

    // This code will not blocks
    go func() {
        for _, link := range links {
            testRequest(link, c)
        }
    }()

    // Above code doesn't block, this code can excutes
    for {
        msg := <-c
        fmt.Println(msg)
    }
}

func testRequest(s string, c chan string) {
    _, err := http.Get(s)
    if err != nil {
        fmt.Println(s, "Is down presently")
        c <- "Something might be down"
        return
    }
    fmt.Println(s, "Is working perfectly")
    c <- "Working great!"
}
package main

import (
    "fmt"
    "net/http"
)

func main() {
    links := []string{
            "http://google.com",
            "http://amazon.com",
            "http://golang.org",
            "http://yahoo.com",
            "http://ebay.com",
    }

    c := make(chan string)

    go func() {
            for _, link := range links {
                    testRequest(link, c)
            }
            close(c)
    }()
    for msg := range c {
            fmt.Println(msg)
    }
    fmt.Println("Done handling request")
}

func testRequest(s string, c chan string) {
    _, err := http.Get(s)
    if err != nil {
            fmt.Println(s, "Is down presently")
            c <- "Something might be down"
            return
    }
    fmt.Println(s, "Is working perfectly")
    c <- "Working great!"
}