Concurrency GoLang FanIn功能不工作

Concurrency GoLang FanIn功能不工作,concurrency,go,Concurrency,Go,所以我想用Rob Pike的fanin函数写一个webcrawler 这是我的密码- package main import ( "net/http" "encoding/json" "fmt" "io/ioutil" ) func main() { fanIn(getDuckDuckGo("food"), getGitHub("defunkt")) } type DuckDuckGoResponse struct { RelatedTopi

所以我想用Rob Pike的fanin函数写一个webcrawler

这是我的密码-

package main
import (
    "net/http"
    "encoding/json"
    "fmt"
    "io/ioutil"
)


func main() {
   fanIn(getDuckDuckGo("food"), getGitHub("defunkt"))

}

type DuckDuckGoResponse struct {
    RelatedTopics []struct {
        Result string `json:"Result"`
        FirstUrl string `json:"FirstURL"`
        Text string `json:"Text"`
    } `json:"RelatedTopics"`
}

type GitHubResponse struct {
    Login string `json:"login"`
    Email string `json:"email"`
    Name string `json:"name"`
}

func fanIn(input1 <-chan DuckDuckGoResponse, input2 <-chan GitHubResponse) <-chan string {
    c := make(chan string)
    go func() {
        for {
            select {
            case s := <-input1:
                fmt.Println(s)
            case s := <-input2:
                fmt.Println(s)
            }
        }
    }()
    return c
}


func getDuckDuckGo(k string) <-chan DuckDuckGoResponse {
    resp, err := http.Get("http://api.duckduckgo.com/?q=" + k + "&format=json&pretty=1")
    if err != nil {
        return nil
    }
    c := make(chan DuckDuckGoResponse)
    var duckDuckParsed DuckDuckGoResponse
    jsonDataFromHttp, jsonErr := ioutil.ReadAll(resp.Body)

    if jsonErr != nil {
        fmt.Println("Json error!")
    }
    defer resp.Body.Close()


    if err:= json.Unmarshal(jsonDataFromHttp, &duckDuckParsed); err != nil {
        panic(err)
    }
    return c
}

func getGitHub(k string) <-chan GitHubResponse {
    resp, err := http.Get("https://api.github.com/users/?q=" + k)
    if err != nil {
        return nil
    }
    c := make(chan GitHubResponse)

    var githubParsed GitHubResponse
    jsonDataFromHttp, jsonErr := ioutil.ReadAll(resp.Body)

    if jsonErr != nil {
        fmt.Println("Json error!")
    }

    defer resp.Body.Close()

    if err:= json.Unmarshal(jsonDataFromHttp, &githubParsed); err != nil {
        panic(err)
    }
    return c
}
主程序包
进口(
“net/http”
“编码/json”
“fmt”
“io/ioutil”
)
func main(){
fanIn(getDuckDuckGo(“食品”)、getGitHub(“脱发”))
}
类型DuckDuckGoResponse结构{
相关主题[]结构{
结果字符串`json:“结果”`
FirstUrl字符串`json:“FirstUrl”`
文本字符串`json:“文本”`
}`json:“相关主题”`
}
类型GitHubResponse结构{
登录字符串`json:“登录”`
电子邮件字符串`json:“电子邮件”`
名称字符串`json:“名称”`
}

丰法宁(input1乍一看,
fanIn
函数返回一个在主循环中没有被读取的通道。因此,是的,您正在调用
fanIn
函数,该函数返回一个通道,但没有读取该通道的内容。要使通道有用,需要有一个消费者从该通道消费,而另一端需要一个制作人在该频道上制作。换句话说,除非另一端的人准备好接收,否则在该频道上发送无法取得进展

接下来,您的
getGitHub
getDuckDuckGo
返回频道,但它们实际上不会在它们返回的频道上发送任何内容。此外,您真正需要的是调用这些函数的方法,让它们返回频道并仍然执行您的工作。您需要使用额外的GoRoutine才能拥有http.Get calls完成他们的工作

最后,fanIn函数也会创建一个通道并返回它,但是它实际上不会“扇入”input1或input2的结果。因为fanIn返回一个字符串类型的通道,所以您需要在其中写入一个字符串,该字符串可能是
DuckDuckGoResponse
GitHubResponse
中的一个字段

我敦促你们也看看这个简化的例子,看看你们正在努力实现的目标:

最后一个观察结果是检查
jsonErr!=nil
并将其打印出来,但您可能也想返回nil,以防止代码继续运行


我希望这能给你足够的洞察力让你的代码正常工作。祝你好运!

你是什么意思?我想通过调用扇入函数,每当我的一个子通道返回一个值时,就会有东西打印出来?你是什么意思?我想扇入函数每次通道返回一个值时都会运行printlns?请参见t他的文章:特别引用这篇文章:
接收者总是阻塞直到有数据要接收。如果通道没有缓冲,发送者阻塞直到接收者收到值。