我是Golang的新手,並且是一般編譯的靜態類型編程。我之前的所有經驗都與Python有關。當我終於讓我的腦海圍繞許多先前對我來說陌生的概念(垃圾收集,指針,範圍)時,這種範式轉變既令人沮喪(程序很少編譯),也帶來了回報。Golang,指針,函數
有人可以在概念層面向我解釋爲什麼這個程序不會編譯和解決它的語法?我只是想查詢數據庫並打印結果:
package main
import (
"database/sql"
"log"
_ "github.com/denisenkom/go-mssqldb"
)
func main() {
db, err := sql.Open("sqlserver", "odbc:server=myServer;user id=myName;password=myPassword;")
if err != nil {
log.Fatal(err)
}
defer db.Close()
q()
}
func q() {
var (
id int
name string
)
rows, err := db.Query("SELECT id, name FROM myTable")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
err := rows.Scan(&id, &name)
if err != nil {
log.Fatal(err)
}
log.Println(id, name)
}
err = rows.Err()
if err != nil {
log.Fatal(err)
}
}
我得到的錯誤是:
undefined: db in db.Query
的查詢工作,當我把裏面的邏輯Q()在主函數中 - 我假設這是因爲函數具有「本地」範圍(是否是正確的術語?),我需要像在主函數中那樣定義db對象。
如果是這種情況 - 我如何運行q()函數而不重複建立數據庫連接?這是「指針」進來嗎?另外,我還是不確定的,以什麼&符號在這裏做的:
err := rows.Scan(&id, &name)
感謝
如何有關傳遞'db'作爲參數傳遞給'Q()'?這將工作。 –
這對python範圍規則無效,你在'main'中定義'db',但是試圖在'q'中引用它。 – JimB
相關:https://stackoverflow.com/questions/40587008/how-do-i-handle-opening-closing-db-connection-in-a-go-app – JimB