2013-04-28 118 views
1

我在創建一個可以傳遞給用戶顯示模板的sql結果片。我有以下內容:追加到結果片

type Post struct { 
    Title string 
} 

func landing(w http.ResponseWriter, r *http.Request){ 
    posts := make([]Post, 0) 
    conn := OpenConnection() 
    defer conn.Close() 
    rows, err := conn.Query("SELECT p.title FROM posts p LIMIT 100") 
    if err != nil { 
    fmt.Println(err) 
    } else { 
    for rows.Next() { 
     var title string 
     rows.Scan(&title) 
     posts := append(posts, Post{Title: title}) //error thrown here 
    } 
    } 
    t, _ := template.ParseFiles("home.html") 
    t.Execute(w, posts) 
} 

func main() { 
    http.HandleFunc("/", landing) 
} 

在編譯時,我給出了錯誤posts declared and not used。 如果我在追加調用後編譯,但似乎是在每次迭代中重置帖子的值而不是追加。

這樣做的正確方法是什麼?

回答

3

Declarations and scope

的聲明結合非空白標識符爲一個常數,類型, 變量,函數,或包。程序中的每個標識符必須爲 。沒有標識符可以在同一個塊中聲明兩次,並且 沒有標識符可以在文件和包塊中聲明。

Declaration = ConstDecl | TypeDecl | VarDecl . 
TopLevelDecl = Declaration | FunctionDecl | MethodDecl . 

聲明的標識符的範圍是源文本中 其中標識表示指定的常數,類型,變量, 功能,或包的程度。

轉到使用塊詞法作用域:

  • 一個預聲明標識符的範圍是宇宙塊。
  • 在頂層(任何函數之外)聲明的表示常量,類型,變量或函數(但不是方法)的標識符的作用域是包塊。
  • 導入的包標識符的範圍是包含導入聲明的文件的文件塊。
  • 表示函數參數或結果變量的標識符的範圍是函數體。
  • 在函數內聲明的常量或變量標識符的範圍從ConstSpec或VarSpec(ShortVarDecl ,簡稱變量聲明)的末尾開始,並在最裏面的 包含塊的末尾結束。
  • 函數內聲明的類型標識符的範圍從TypeSpec中的標識符開始,並在最內層的塊的末尾結束。

塊中聲明的標識符可以在內部塊中重新聲明。 雖然內部聲明的標識符在範圍內,但它表示由內部聲明聲明的實體 。

Short variable declarations

短變量聲明使用語法:

ShortVarDecl = IdentifierList ":=" ExpressionList . 

它是與初始化 和常規的變量聲明的簡寫,但沒有類型:

"var" IdentifierList = ExpressionList . 

不同於常規變量聲明,短變量聲明可能 redeclare vari如果它們最初是在相同類型的 塊中聲明的,並且至少有一個非空白變量 是新的。因此,重新聲明只能出現在多變量短期聲明 中。重新申報不會引入 新變量;它只是爲原件分配一個新的值。

您在內部範圍內有一個短變量聲明posts。因此,不使用內部範圍內的短變量聲明posts

posts := make([]Post, 0) 
{ 
    posts := append(posts, Post{Title: title}) //error thrown here 
} 

你想賦值posts,在外部範圍聲明的變量,在內部範圍。

posts := make([]Post, 0) 
{ 
    posts = append(posts, Post{Title: title}) 
} 
+1

我在猜測OP知道':='的意思,只是犯了一個錯誤。 ':='與'='有些相似。但是,這是內部範圍變量不被使用,而不是外部......只是要清楚。 – 2013-04-28 02:18:40