我正在尝试创建一片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)
在append调用之后进行编译,但它似乎是在每次迭代时重置post的值,而不是追加。
正确的方法是什么?
声明将非空白标识符绑定到常量,类型,变量,函数或包。程序中的每个标识符都必须声明。不能在同一块中声明两次标识符,也不能在文件和包块中声明任何标识符。
Declaration = ConstDecl | TypeDecl | VarDecl . TopLevelDecl = Declaration | FunctionDecl | MethodDecl .
声明的标识符的范围是源文本的范围,其中标识符表示指定的常量,类型,变量,函数或包。
Go使用块在词法范围内:
- 预定义标识符的范围是Universe块。
- 表示在顶层(任何函数之外)声明的常量,类型,变量或函数(但不是方法)的标识符的范围是package块。
- 导入的程序包标识符的范围是包含导入声明的文件的文件块。
- 表示功能参数或结果变量的标识符的范围是功能主体。
- 在函数内部声明的常量或变量标识符的范围始于ConstSpec或VarSpec的末尾(对于简短变量声明,为ShortVarDecl),并终止于最里面的包含块的末尾。
- 在函数内部声明的类型标识符的范围始于TypeSpec中的标识符,并在最里面的包含块的末尾结束。
在块中声明的标识符可以在内部块中重新声明。内部声明的标识符在范围内,它表示内部声明声明的实体。
简短的变量声明使用以下语法:
ShortVarDecl = IdentifierList ":=" ExpressionList .
这是带有初始化表达式但没有类型的常规变量声明的简写:
"var" IdentifierList = ExpressionList .
与常规变量声明不同,短变量声明可以重新声明变量,前提是它们最初是在同一块中以相同类型声明的,并且至少一个非空白变量是新变量。因此,重新声明只能出现在多变量简短声明中。重新声明不会引入新的变量;它只是为原始值分配一个新值。
您posts
在内部作用域中有一个简短的变量声明。因此,posts
不使用内部作用域中的short变量声明。
posts := make([]Post, 0)
{
posts := append(posts, Post{Title: title}) //error thrown here
}
您需要分配给posts
在外部作用域中,在内部作用域中声明的变量。
posts := make([]Post, 0)
{
posts = append(posts, Post{Title: title})
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句