2015-01-16 3 views
-1

Итак, я пытаюсь написать веб-браузер с использованием функции фаната Роба Пайка.Функция GoLang FanIn не работает

Это мой код -

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 
} 

я запустить эту программу, и ничего не печатает.

Почему?

Благодаря

+0

Что вы имеете в виду? Я подумал, что, позвонив поклоннику в функцию, что-то будет печатать каждый раз, когда один из моих подканалов возвращает значение? – praks5432

ответ

0

На первом взгляде, функция fanIn возвращает канал, который не считывается из вашего основного цикла. Итак, да, вы вызываете функцию fanIn, которая возвращает канал, но ничего не слышно от этого канала. Для того чтобы канал был полезным, должен быть потребитель , потребляющий от канала, а на другом конце должен быть производитель , производя на этом канале. Другими словами, отправка по каналу не может прогрессировать, если кто-то на другом конце не готов принять на нем.

Далее, ваши getGitHub и getDuckDuckGo возвращают каналы, но они фактически ничего не посылают по каналам, которые они возвращают. Кроме того, вам действительно нужен способ вызова этих функций, чтобы они возвращали канал и все еще выполняли вашу работу. Вам нужно использовать дополнительные goroutines, чтобы иметь возможность использовать вызовы http.Get.

Наконец, ваша функция fanIn также создает канал и возвращает его, однако на самом деле он не «встраивает» результаты с входа 1 или входа2. Так как fanIn возвращает канал типа string, вам нужно будет записать в него строку, которая может быть полем DuckDuckGoResponse и GitHubResponse.

Я призываю вас слишком смотреть на этот обтекаемый пример того, что вы пытаетесь достичь: https://talks.golang.org/2012/go-docs/faninboring.go

Последнее наблюдение вы проверяете, что jsonErr != nil и печать его, но вы, вероятно, хотите, чтобы вернуть ноль, а для предотвращения код от продолжения.

Надеюсь, это даст вам достаточно информации, чтобы заставить ваш код работать. Удачи!

+0

Что значит? Я думал, что функция вентилятора просто запускает printlns каждый раз, когда каналы отправляют обратно значение? – praks5432

+0

См. Эту статью: https://golang.org/doc/effective_go.html#channels В частности, чтобы процитировать статью: 'Приемники всегда блокируются до тех пор, пока не будут получены данные. Если канал небуферизован, отправитель блокирует, пока получатель не получит значение. ' –

Смежные вопросы