明明没有初始化DB { mu sync.Mutex }字段,db对象的方法却在使用db.mu.Lock,找来找去没找到这个字段在哪里赋值了。
func Open(driverName, dataSourceName string) (*DB, error) {
driversMu.RLock()
driveri, ok := drivers[driverName]
driversMu.RUnlock()
if !ok {
return nil, fmt.Errorf("sql: unknown driver %q (forgotten import?)", driverName)
}
db := &DB{
driver: driveri,
dsn: dataSourceName,
openerCh: make(chan struct{}, connectionRequestQueueSize),
lastPut: make(map[*driverConn]string),
}
go db.connectionOpener()
return db, nil
}
func (db *DB) Ping() error {
dc, err := db.conn(cachedOrNewConn)
if err != nil {
return err
}
db.putConn(dc, nil)
return nil
}
func (db *DB) conn(strategy connReuseStrategy) (*driverConn, error) {
db.mu.Lock()
if db.closed {
// .................