github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/talks/2012/tutorial/4method.go (about) 1 // +build OMIT 2 3 package main 4 5 import ( 6 "encoding/json" 7 "errors" 8 "fmt" 9 "log" 10 "net/http" 11 ) 12 13 func main() { 14 items, err := Get("golang") 15 if err != nil { 16 log.Fatal(err) 17 } 18 for _, item := range items { 19 fmt.Println(item) 20 } 21 } 22 23 type Response struct { 24 Data struct { 25 Children []struct { 26 Data Item 27 } 28 } 29 } 30 31 type Item struct { 32 Title string 33 URL string 34 Comments int `json:"num_comments"` 35 } 36 37 func (i Item) String() string { 38 com := "" 39 switch i.Comments { 40 case 0: 41 // nothing 42 case 1: 43 com = " (1 comment)" 44 default: 45 com = fmt.Sprintf(" (%d comments)", i.Comments) 46 } 47 return fmt.Sprintf("%s%s\n%s", i.Title, com, i.URL) 48 } 49 50 func Get(reddit string) ([]Item, error) { 51 url := fmt.Sprintf("http://reddit.com/r/%s.json", reddit) 52 resp, err := http.Get(url) 53 if err != nil { 54 return nil, err 55 } 56 defer resp.Body.Close() 57 if resp.StatusCode != http.StatusOK { 58 return nil, errors.New(resp.Status) 59 } 60 r := new(Response) 61 err = json.NewDecoder(resp.Body).Decode(r) 62 if err != nil { 63 return nil, err 64 } 65 items := make([]Item, len(r.Data.Children)) 66 for i, child := range r.Data.Children { 67 items[i] = child.Data 68 } 69 return items, nil 70 }