我在做一个关于Golang的在线课程.课程material 中提供了以下代码,作为误用sync.Once
的示例:
var (
once sync.Once
db *sql.DB
)
func DbOnce() (*sql.DB, error) {
var err error
once.Do(func() {
fmt.Println("Am called")
db, err = sql.Open("mysql", "root:test@tcp(127.0.0.1:3306)/test")
if err != nil {
return
}
err = db.Ping()
})
if err != nil {
return nil, err
}
return db, nil
}
据推测,以上是SQL连接管理器的错误实现.我们,学生们,要自己go 发现错误,这是我努力克服的.即使并行运行,代码也运行良好.我就是这样使用它的:
func main() {
wg := sync.WaitGroup{}
wg.Add(10)
for i := 0; i < 10; i++ {
go (func() {
db, err := DbOnce()
if err != nil {
panic(err)
}
var v int
r := db.QueryRow("SELECT 1")
err = r.Scan(&v)
fmt.Println(v, err)
wg.Done()
})()
}
wg.Wait()
}
我知道这里不鼓励学生提出家庭作业(job)问题,所以我不是在要求一个完整的解决方案,只是一个提示就可以了.错误是否与并发性有关(即,我需要在特定的并发上下文中运行它)?这就是sql的用法.特别开放?