Моя цель - использовать struct для wrap sql.DB, чтобы сделать что-то большее, чем sql.DB. Созданный экземпляр не может работать и давать мне эту ошибку при запуске.Обернутый sql.DB от struct не может вызывать методы в примере
DbConn.db.prepare undefined (cannot refer to unexported field or method sql.(*DB)."".prepare)
Мой код:
type DatabaseConn struct {
driverName string
databaseName string
userName string
password string
dataSourceName string
db *sql.DB
}
func (d DatabaseConn)Open() error {
d.driverName = DB_DRNAME
d.userName = DB_UNAME
d.password = DB_PWD
d.databaseName = DB_DBNAME
d.dataSourceName = fmt.Sprintf("%s:%[email protected]/%s?charset=utf8",d.userName, d.password, d.databaseName)
db, err := sql.Open(d.driverName, d.dataSourceName)
return err
}
func (d *DatabaseConn)Close() error {
defer func() {
if err := recover(); err != nil {
fmt.Println("Trying to handle error in DatabaseConn.Close(): ", err)
}
}()
err := d.db.Close()
return err
}
Я пытаюсь создать экземпляр и вызвать метод sql.DB.
var dbConn DatabaseConn
dbConn.Open()
defer dbConn.Close()
dbQuery := fmt.Sprintf("SELECT *, FROM ms_node WHERE node_id = ?")
getNodeRecord, err := dbConn.db.prepare(dbQuery)
Здесь указано сообщение об ошибке.
./server.go:343: dbConn.db.prepare undefined (cannot refer to unexported field or method sql.(*DB)."".prepare)
(Личный опыт: Я новичок в течение 2 недель)
Есть все этот код внутри одного пакета? Вы также должны удалить свое использование 'defer' - это не поможет сделать ваш код более четким или безопасным. – elithrar
@elithrar Да. Я предполагаю, что они находятся в одном пакете, так как они находятся в одном файле .go. Я думаю, что что-то не так с указателем и экземпляром. Но я не могу сказать, что проблема есть. Извините, я не очистил отсрочку. Я делаю это прямо сейчас. –
Я думаю, вы хотите sql.Open назначить d.db, а не только db. Также возможна синтаксическая ошибка sql: *, – Mark