我对Go还是陌生的,我正在尝试使用Ben Johnson网页的指导来创建结构化的应用程序。不幸的是,他的例子并不是一个完整的应用程序。
他的网页是https://medium.com/@benbjohnson/standard-package-layout-7cdbc8391fc1
我尝试使用他的方法,但不断收到“未定义:db”错误。它不会告诉我是哪一行引起了错误,只是文件“ MSSQL.go”
有人可以提供指导来帮助我解决此错误吗?
具有可接受解决方案的已编辑代码。
package statementprinter
type Statement struct {
CustomerId string
CustomerName string
}
type StatementService interface {
Statement(id string) (*Statement, error)
}
package main
import (
"fmt"
"log"
"github.com/ybenjolin/StatementPrinter"
"github.com/ybenjolin/StatementPrinter/mssql"
"database/sql"
_ "github.com/alexbrainman/odbc"
)
const DB_INFO = "Driver={SQL Server};Server=cdc-edb2;Database=CostarReports;Trusted_Connection=yes;"
var db *sql.DB
func init() {
var err error
db, err = sql.Open("odbc", DB_INFO)
if err != nil {
log.Fatal("Error opening database connection.\n", err.Error())
}
err = db.Ping()
if err != nil {
log.Fatal("Error pinging database server.\n", err.Error())
}
fmt.Println("Database connection established.")
}
func main () {
var err error
defer db.Close()
// Create services
// Changes required here. Was ss := &statementprinter.Stat..
ss := &mssql.StatementService{DB: db}
// Use service
var s *statementprinter.Statement
s, err = ss.Statement("101583")
if err != nil {
log.Fatal("Query failed:", err.Error())
}
fmt.Printf("Statement: %+v\n", s)
}
package mssql
import (
_ "github.com/alexbrainman/odbc"
"database/sql"
"github.com/ybenjolin/StatementPrinter"
)
// StatementService represents a MSSQL implementation of statemenetprinter.StatementService.
type StatementService struct {
DB *sql.DB
}
// Statement returns a statement for a given customer.
func (s *StatementService) Statement(customer string) (*statementprinter.Statement, error) {
var err error
var t statementprinter.Statement
// Changes required here. Was row := db.Query......
row := s.DB.QueryRow(`Select Customer, CustomerName From AccountsReceivable.rptfARStatementHeader(?)`, customer)
if row.Scan(&t.CustomerId, &t.CustomerName); err != nil {
return nil, err
}
return &t, nil
这似乎只是一个错字。看来方法中有问题
func (s *StatementService) Statement(customer string)
在mssql.go中,
row := db.QueryRow(`Select Customer, CustomerName From AccountsReceivable.rptfARStatementHeader(?)`, customer)
QueryRow
应该是的方法db
,但db
未定义。但是,在结构
type StatementService struct {
DB *sql.DB
}
有一个*sql.DB
实例。您使用的方法有一个*StatementService
参数s
。所以,我的猜测是,意图是像这样访问该sql.DB
字段s
func (s *StatementService) Statement(customer string) (*statementprinter.Statement, error) {
var err error
var t statementprinter.Statement
//CHANGED LINE:
row := s.DB.QueryRow(`Select Customer, CustomerName From AccountsReceivable.rptfARStatementHeader(?)`, customer)
if row.Scan(&t.CustomerId, &t.CustomerName); err != nil {
return nil, err
}
return &t, nil
然后,在main.go中调用该方法,并传递一个StatementService
包含数据库的实例:
ss := &statementprinter.StatementService{DB: db}
我相信您需要将此行更改为
ss := &mssql.StatementService{DB: db}
因为那是实际的接口实现。现在,您在该行中将StatementService接口视为将无法编译的结构。db
main.go中的全局变量在应用程序的生命期内生存。它只是一个指针,被复制以供使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句