Concurrency GoLang FanIn功能不工作
所以我想用Rob Pike的fanin函数写一个webcrawler 这是我的密码-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
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他的文章:特别引用这篇文章:接收者总是阻塞直到有数据要接收。如果通道没有缓冲,发送者阻塞直到接收者收到值。