Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "encoding/json"
- "fmt"
- "log"
- "net/http"
- "sync"
- )
- const (
- storiesURL = "https://hacker-news.firebaseio.com/v0/topstories.json"
- itemURL = "https://hacker-news.firebaseio.com/v0/item"
- )
- type (
- story struct {
- Title string `json:"title"`
- }
- storyID int
- )
- func main() {
- resp, err := http.Get(storiesURL)
- if err != nil {
- log.Fatalln(err)
- }
- defer resp.Body.Close()
- var ids []storyID
- if err := json.NewDecoder(resp.Body).Decode(&ids); err != nil {
- log.Fatalln(err)
- }
- workChan := make(chan storyID, len(ids))
- wg := sync.WaitGroup{}
- for i := 0; i < 8; i++ {
- wg.Add(1)
- go func() (err error) {
- defer wg.Done()
- for id := range workChan {
- url := fmt.Sprintf("%s/%d.json", itemURL, id)
- resp, err := http.Get(url)
- if err != nil {
- return err
- }
- defer resp.Body.Close()
- var story story
- if err := json.NewDecoder(resp.Body).Decode(&story); err != nil {
- return err
- }
- fmt.Println(story.Title)
- }
- return nil
- }()
- }
- for _, id := range ids {
- workChan <- id
- }
- close(workChan)
- wg.Wait()
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement