我正在查看代码示例sql.query,但对变量初始化的方式感到有些困惑。据我所知,var关键字用于初始化变量,但是如果您已经有这样的变量,最好“重用”它而不是重新初始化它。我知道我可能误解了Golang规范,因此希望这个问题可以帮助我(也许还有其他人)理解得更清楚。
rows, err := db.Query("SELECT name FROM users WHERE age=?", age)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
var name string
if err := rows.Scan(&name); err != nil {
log.Fatal(err)
}
fmt.Printf("%s is %d\n", name, age)
}
if err := rows.Err(); err != nil {
log.Fatal(err)
}
为什么"名称"变量在循环内初始化而不是循环外?(见下文)。重复初始化它不会降低性能吗?
//how I would do this
rows, err := db.Query("SELECT name FROM users WHERE age=?", age)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
var name string //outside the loop
for rows.Next() {
if err := rows.Scan(&name); err != nil {
log.Fatal(err)
}
fmt.Printf("%s is %d\n", name, age)
}
if err := rows.Err(); err != nil {
log.Fatal(err)
}
或者更好的方法是使用指针。
rows, err := db.Query("SELECT name FROM users WHERE age=?", age)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
name := new(string) //pointer outside the loop
for rows.Next() {
if err := rows.Scan(name); err != nil {
log.Fatal(err)
}
fmt.Printf("%s is %d\n", name, age)
}
if err := rows.Err(); err != nil {
log.Fatal(err)
}
name
在循环之前被声明,否则它将被限定在if块内,在该块之外无法使用它(即:您不能在之后使用它)。循环不会重新初始化它,它只是重复使用它。该块(循环)位于变量声明之后。 - elithrar