Golang标准包装结构

本·乔林:

我对Go还是陌生的,我正在尝试使用Ben Johnson网页的指导来创建结构化的应用程序。不幸的是,他的例子并不是一个完整的应用程序。

他的网页是https://medium.com/@benbjohnson/standard-package-layout-7cdbc8391fc1

我尝试使用他的方法,但不断收到“未定义:db”错误。它不会告诉我是哪一行引起了错误,只是文件“ MSSQL.go”

有人可以提供指导来帮助我解决此错误吗?

具有可接受解决方案的已编辑代码。

StatementPrinter.go

    package statementprinter

    type Statement struct {
      CustomerId   string
      CustomerName string
    }

    type StatementService interface {
      Statement(id string) (*Statement, error)
    }

main.go

            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)
            }

mssql.go

    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接口视为将无法编译的结构。dbmain.go中的全局变量在应用程序的生命期内生存。它只是一个指针,被复制以供使用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章