我正在尝试创建一段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)
进行编译,但它似乎在每次迭代时重置帖子的值而不是附加。
这样做的正确方法是什么?
答案 0 :(得分:3)
声明将非空标识符绑定到常量类型, 变量,函数或包。程序中的每个标识符都必须是 声明。没有标识符可以在同一个块中声明两次,并且 文件和包块中都不能声明标识符。
Declaration = ConstDecl | TypeDecl | VarDecl . TopLevelDecl = Declaration | FunctionDecl | MethodDecl .
声明的标识符的范围是源文本的范围 其中标识符表示指定的常量,类型,变量, 功能或包装。
Go使用块进行词法作用:
- 预先声明的标识符的范围是Universe块。
- 标识符的范围,表示在顶层(在任何函数之外)声明的常量,类型,变量或函数(但不是方法) 是包块。
- 导入的包标识符的范围是包含导入声明的文件的文件块。
- 表示函数参数或结果变量的标识符的范围是函数体。
- 在函数内声明的常量或变量标识符的范围从ConstSpec或VarSpec(ShortVarDecl)的末尾开始 对于短变量声明)并在最里面的末尾结束 包含块。
- 在函数内声明的类型标识符的范围从TypeSpec中的标识符开始,到最里面的末尾结束 包含块。
块中声明的标识符可以在内部块中重新声明。 虽然内部声明的标识符在范围内,但它表示 内部声明声明的实体。
短变量声明使用语法:
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})
}