在学习Go语言中,我遇到了如标题的错误信息,找了各种搜索引擎,思考了几天,终于尝试出问题出在哪儿? 下边是我的错误代码
package main
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
)
type user struct {
id int
name string
age int
}
var db *sqlx.DB
func init() {
var err error
dsn := "user:123456@tcp(127.0.0.1:3306)/sql_test?charset=utf8mb4&parseTime=True"
db, err = sqlx.Connect("mysql", dsn)
if err != nil {
fmt.Printf("connect DB failed, err:%v\n", err)
return
}
//设置与数据库建立连接的最大数目
db.SetMaxOpenConns(20)
//设置连接池中的最大闲置连接数
db.SetMaxIdleConns(10)
}
func queryRowDemo(id int) {
sql := "select `id`,`name`,`age` from user where id=?"
var u user
err := db.Get(&u, sql, id)
if err != nil {
fmt.Printf("get failed, err:%v\n", err)
return
}
fmt.Printf("id:%d, name:%s, age:%d\n", u.id, u.name,u.age)
}
func main() {
queryRowDemo(2)
}
下边贴出我的修正代码
package main
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
)
type User struct {
Id int
Name string
Age int
}
var db *sqlx.DB
func init() {
var err error
dsn := "user:123456@tcp(127.0.0.1:3306)/sql_test?charset=utf8mb4&parseTime=True"
db, err = sqlx.Connect("mysql", dsn)
if err != nil {
fmt.Printf("connect DB failed, err:%v\n", err)
return
}
//设置与数据库建立连接的最大数目
db.SetMaxOpenConns(20)
//设置连接池中的最大闲置连接数
db.SetMaxIdleConns(10)
}
func queryRowDemo(id int) {
sql := "select `id`,`name`,`age` from user where id=?"
var u User
err := db.Get(&u, sql, id)
if err != nil {
fmt.Printf("get failed, err:%v\n", err)
return
}
fmt.Printf("id:%d, name:%s, age:%d\n", u.Id, u.Name,u.Age)
}
func main() {
queryRowDemo(2)
}
可以从代码中发现, 结构体user的访问限制改为全局(即大写)。 这里我们可以理解了,当db.Get(&u,sql,id)执行时,sqlx包中会访问结构体u中的各字段,这时发现字段全部为小写,不可访问,即报错了。我们修改为大写即解决了问题。