title: Golang Pointer Understanding
body: <p>I am learning go and i need to understand something. I am getting few errors. I have created a Product struct and attached a func with it. I also got a product lists as a slice. Actually I am following one example. I was just trying add different endpoints to it.</p>
  
  <p>I have added question in comment in code. Please explain. I need to return the json single object as a response to user. Please guide me.</p>
  
  <pre><code>
  package data 
  
  type Product struct {
      ID          int     `json:"id"`
      Name        string  `json:"name"`
      Description string  `json:"description"`
      Price       float32 `json:"price"`
      SKU         string  `json:"sku"`
      CreatedOn   string  `json:"-"`
      UpdatedOn   string  `json:"-"`
      DeletedOn   string  `json:"-"`
  }
  
  type Products []*Product
  
  
  func (p *Products) ToJSON(w io.Writer) error {
      e := json.NewEncoder(w)
      return e.Encode(p)
  }
  
  func (p *Product) FromJSON(r io.Reader) error {
      d := json.NewDecoder(r)
      return d.Decode(p)
  }
  
  var ErrProductNotFound = fmt.Errorf("Product not found")
  
  
  func GetProduct(id int) (*Product, error) {       // this is returning *Product &amp; err. When I use this in GetProduct in handler func it is giving error
      for _, p := range productList {
          if p.ID == id {
              fmt.Println(p)
              return p, nil
          }
      }
      return nil, ErrProductNotFound
  }
  
  var productList = []*Product{    **// Why in example the teacher doing it like this.** []*Product{&amp;Product{}, &amp;Product{}} **what it the reason? Please explain.
      &amp;Product{                             // this gives warning : redundant type from array, slice, or map composite literal. need to understand why**
  
          ID:          1,
          Name:        "Latte",
          Description: "chai",
          Price:       2.45,
          SKU:         "abc123",
          CreatedOn:   time.Now().UTC().String(),
          UpdatedOn:   time.Now().UTC().String(),
      },
      &amp;Product{
          ID:          2,
          Name:        "Tea",
          Description: "chai",
          Price:       1.45,
          SKU:         "abc1234",
          CreatedOn:   time.Now().UTC().String(),
          UpdatedOn:   time.Now().UTC().String(),
      },
  }
  package handlers
  
  func (p *Product) GetProduct(rw http.ResponseWriter, r *http.Request) {
      vars := mux.Vars(r)
      id, _ := strconv.Atoi(vars["id"])
      p, errr := data.GetProduct(id)  **// cannot use data.GetProduct(id) (value of type *data.Product) as *Product value in assignment**
      errr = p.ToJSON(rw) // **p.ToJSON undefined (type *Product has no field or method ToJSON)**
      if errr != nil {
          http.Error(rw, "could not locate the product", http.StatusBadGateway)
      }
  }
  </code></pre>