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  }