2013-04-28 81 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