附加到一片结果

时间:2013-04-28 01:14:06

标签: go

我正在尝试创建一段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。 如果我在追加调用后我fmt.Println(posts)进行编译,但它似乎在每次迭代时重置帖子的值而不是附加。

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

  

Declarations and scope

     

声明将非空标识符绑定到常量类型,   变量,函数或包。程序中的每个标识符都必须是   声明。没有标识符可以在同一个块中声明两次,并且   文件和包块中都不能声明标识符。

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

声明的标识符的范围是源文本的范围   其中标识符表示指定的常量,类型,变量,   功能或包装。

     

Go使用块进行词法作用:

     
      
  • 预先声明的标识符的范围是Universe块。
  •   
  • 标识符的范围,表示在顶层(在任何函数之外)声明的常量,类型,变量或函数(但不是方法)   是包块。
  •   
  • 导入的包标识符的范围是包含导入声明的文件的文件块。
  •   
  • 表示函数参数或结果变量的标识符的范围是函数体。
  •   
  • 在函数内声明的常量或变量标识符的范围从ConstSpec或VarSpec(ShortVarDecl)的末尾开始   对于短变量声明)并在最里面的末尾结束   包含块。
  •   
  • 在函数内声明的类型标识符的范围从TypeSpec中的标识符开始,到最里面的末尾结束   包含块。
  •   
     

块中声明的标识符可以在内部块中重新声明。   虽然内部声明的标识符在范围内,但它表示   内部声明声明的实体。

     

Short variable declarations

     

短变量声明使用语法:

ShortVarDecl = IdentifierList ":=" ExpressionList .
     

它是使用初始化程序进行常规变量声明的简写   表达式,但没有类型:

"var" IdentifierList = ExpressionList .
     

与常规变量声明不同,短变量声明可以   重新声明变量,只要它们最初在同一声明中声明   具有相同类型的块,以及至少一个非空白变量   是新的。因此,重新声明只能出现在   多变量简短声明。重新申报不会引入   新变量;它只是为原始版本赋予了一个新值。

内部范围内有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})
}