Чтобы отсканировать каждую строку в ее собственную структуру, я рекомендую такой подход:
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
)
type Person struct {
FirstName string
LastName string
Email string
}
func main() {
db, err := sql.Open("mysql", "dsn...")
if err != nil {
log.Fatalln(err)
}
defer db.Close()
people := []Person{}
rows, err := db.Query("SELECT * FROM people")
if err != nil {
log.Fatalln(err)
}
for rows.Next() {
person := Person{}
if err := rows.Scan(&person.FirstName, &person.LastName, &person.Email); err != nil {
log.Fatalln(err)
}
people = append(people, person)
}
fmt.Printf("%+v\n", people)
}
В качестве альтернативы библиотека https://github.com/jmoiron/sqlx существует в качестве одного из решений для маршалинга данных SQL-запроса в структуры. Я лично предпочитаю этот метод, так как он ведет себя больше как функция Unmarshal
:
package main
import (
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
)
type Person struct {
FirstName string `db:"first_name"`
LastName string `db:"last_name"`
Email string `db:"email"`
}
func main() {
db, err := sqlx.Connect("mysql", "dsn...")
if err != nil {
log.Fatalln(err)
}
people := []Person{}
if err := db.Select(&people, "SELECT * FROM people"); err != nil {
log.Fataln(err)
}
fmt.Printf("%+v\n", people)
}
Использование любого из этих подходов позволяет легко использовать json.Marshal
метод с переменной people
и альтом!
Удачи!