2014-07-21 32 views
-1

我對Stackoverflow比較陌生。我被困在這個問題上。我正在試圖製作一張地圖。前往:地圖相關的錯誤

package main 

import (
    "encoding/json" 
    "fmt" 
    "html/template" 
    "io/ioutil" 
    "log" 
    "net/http" 
    "net/url" 
    "os" 
) 

func main() { 
    http.HandleFunc("/", handler) 
    http.HandleFunc("/showimage", showimage) 
    fmt.Println("listening...") 
    err := http.ListenAndServe(GetPort(), nil) 
    if err != nil { 
     log.Fatal("ListenAndServe: ", err) 
    } 
} 

func GetPort() string { 
    var port = os.Getenv("PORT") 
    if port == "" { 
     port = "4747" 
     fmt.Println("INFO: No PORT environment variable detected, defaulting to " + port) 
    } 
    return ":" + port 
} 

func handler (w http.ResponseWriter, r *http.Request) { 
    fmt.Fprint(w, rootForm) 
} 

const rootForm = 
    `<!DOCTYPE html> 
    <html> 
     <head> 
     <meta charset="utf-8"> 
      <title>Flickr photos</title> 
     </head> 
     <body> 
      <h1>Flickr photos</h1> 
      <p>Find photos by tags!</p> 
      <form action="/showimage" method="post" accept-charset="utf-8"> 
       <input type="text" name="str" value="Type Tags..." id="str"> 
       <input type="submit" value=".. and see the images!"> 
      </form> 
     </body> 
    </html>` 

var upperTemplate = template.Must(template.New("showimage").Parse(upperTemplateHTML)) //irrelevant to issue here 

func showimage(w http.ResponseWriter, r *http.Request) { 
    tag := r.FormValue("str") 
    safeTag := url.QueryEscape(tag) 
    fullUrl := fmt.Sprintf("https://api.instagram.com/v1/users/search?q=%s&access_token=ACCESS-TOKEN&count=1", safeTag) 

    client := &http.Client{} 

    req, err := http.NewRequest("GET", fullUrl, nil) 
    if err != nil { 
     log.Fatal("NewRequest: ", err) 
     return 
    } 

    resp, requestErr := client.Do(req) 
    if requestErr != nil { 
     log.Fatal("Do: ", requestErr) 
     return 
    } 

    defer resp.Body.Close() 

    body, dataReadErr := ioutil.ReadAll(resp.Body) 
    if dataReadErr != nil { 
     log.Fatal("ReadAll: ", dataReadErr) 
     return 
    } 


res := make(map[string][]map[string]interface{}) 

但是,當我試圖把數據進入界面

json.Unmarshal(body, &res) 

userid, _ := res["data"][0]["username"] 

queryUrl := fmt.Sprintf("http://instagram.com/%s", userid) 

我得到的錯誤

http: panic serving [::1]:63089: runtime error: index out of range 
goroutine 28 [running]: 

任何想法,爲什麼?如果我在res:=和userid:=中刪除了[],這個錯誤就解決了,但是我不能訪問我想要的數據。

+1

向我們展示如何用值填充您的地圖。看起來像你的''res [「data」]''指向一個空片。 –

+0

是的,確切地說:首先是整個旅程。你的問題與接口沒有任何關係。 – Volker

+0

@ Ainar-G我已經更新了它。 – AUL

回答

0

「res」的使用是錯誤的。 「res」是一個映射(鍵是字符串,值是一個片),因此res [「data」]可能是代碼中的nil,當您使用res [「data」] [0]時它會發生混亂。應該這樣做:

json.Unmarshal(body, &res) 
s, ok := res["data"] 
if ok { 
    if len(s)>0{ 
     userid , ok := s[0]["username"] 
     if ok{ 
      queryUrl := fmt.Sprintf("http://instagram.com/%s", userid) 
     } 
    } 
}