Я новичок в Golang и скомпилирован, статически типизировал программирование в целом. Весь мой предыдущий опыт был с Python.Голан, указатели, функции
Этот сдвиг парадигмы был как разочаровывающим (программы редко компилируются), так и вознаграждением, так как я, наконец, обдумываю многие концепции, которые ранее были чужды мне (сбор мусора, указатели, область действия).
Может кто-нибудь объяснить мне концептуальный уровень, почему эта программа не будет компилироваться и синтаксис исправить? Я просто пытаюсь сделать запрос к БД и распечатать результаты:
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
Запрос работает, когда я ставлю логику внутри д() в основной функции - я предполагаю, что это потому, что функции имеют «локальную» область (это правильная терминология?), и мне нужно определить объект db, как у меня в основной функции.
Если это так - как запустить функцию q(), не повторяя при установлении соединения db? Это где «указатели» входят? Кроме того, я до сих пор уверен в том, что делают здесь амперсанды:
err := rows.Scan(&id, &name)
Благодарность
как о прохождении 'db' в качестве аргумента' д() '? это сработает. –
Это также не работает с правилами определения python, вы определили 'db' в' main', но пытаетесь ссылаться на него в 'q'. – JimB
Связанный: https://stackoverflow.com/questions/40587008/how-do-i-handle-opening-closing-db-connection-in-a-go-app – JimB