go - 无法在 Go 应用程序的另一个包中使用函数
问题描述
我有一个依赖于几个包的应用程序。但是,当我尝试构建我的应用程序时,它说导入包中的函数未定义。
使用以下函数在主包 (batch.go) 中的文件:
package main
import (
"reflect"
db "bitbucket.org/b***/go-db"
)
// NewBatch creates a new batch
func NewBatch(orderID, employeeID int64) *Batch {
return &Batch{
OrderID: orderID,
EmployeeID: employeeID,
Flag: true,
}
}
// InsertBatch inserts a batch and all the underlying order lines and additions
func InsertBatch(b *Batch) (*Batch, error) {
err := db.Save(b)
InsertOrderLines(b.ID, b.OrderLines)
return b, err
}
具有以下功能的 sonicdb(别名为 db)中的文件:
package sonicdb
import (
"database/sql"
"fmt"
"reflect"
"strings"
)
// Scalar holds a scalar value of a database query, i.e. a count on a table
type Scalar struct {
N int64 `db:"n"`
}
// Repository interface
type Repository interface {
Get(sql string) ([]interface{}, error)
GetAndBind(sql string, i interface{}) ([]interface{}, error)
View(from string, criteria []Clause, selectors ...string) ([]interface{}, error)
Find(i interface{}, id int64) (interface{}, error)
FindAll(i interface{}) ([]interface{}, error)
FindBy(i interface{}, criteria []Clause) ([]interface{}, error)
FindByOrdered(i interface{}, criteria []Clause, ordering map[string]string) ([]interface{}, error)
FindOneBy(i interface{}, criteria []Clause) (interface{}, error)
FindOneByOrdered(i interface{}, criteria []Clause, ordering map[string]string) (interface{}, error)
First(i interface{}, criteria []Clause) (interface{}, error)
Count(i interface{}, criteria []Clause) (int64, error)
Save(i interface{}) error
Update(i interface{}) error
UpdateBy(i interface{}, criteria []Clause) (int64, error)
UpdateFields(i interface{}, fields []*Field) error
DeleteBy(i interface{}, criteria []Clause) (int64, error)
OneToOne(rv reflect.Value, c interface{}, join string) error
OneToMany(parent reflect.Value, child interface{}, mappedBy string) error
Relations(parent reflect.Value) interface{}
MarshalObject(i interface{}) (interface{}, error)
}
// Save handles a save action for a model
func (db *Database) Save(i interface{}) error {
id, err := doInsert(db.DB, i)
if err != nil {
return err
}
rv := reflect.ValueOf(i)
if rv.Type().Kind() == reflect.Ptr {
rv = rv.Elem()
}
for j := 0; j < rv.NumField(); j++ {
field := rv.Field(j)
fieldType := rv.Type().Field(j)
if !field.CanAddr() {
return fmt.Errorf("field `%s` cannot be addressed", fieldType.Name)
}
if !field.CanSet() {
return fmt.Errorf("field `%s` cannot be set", fieldType.Name)
}
if index, ok := fieldType.Tag.Lookup("index"); ok && index == "pk" {
field.SetInt(id)
}
}
return nil
}
错误:
./batch.go:20:9: undefined: sonicdb.Save
bitbucket.org 包使用“go get bitbucket.org/name”导入,现在位于“~/go/src/bitbucket.org/name”中,应该是正确的。
这些包在这个项目的前一个开发者的计算机上运行,但自从我接手后,它就无法构建。这可能是一个简单的解决方法,但我对 Go 的经验非常少。我究竟做错了什么?
解决方案
假设我们有一个名为demo
package demo
type DataBase struct {
A int
B int
}
// function example
func DemoFunc(x int) int {
y := x + x
return y
}
// method example
func (db *DataBase) DemoMethod(x int) int {
y:= db.A + db.B + x
return y
}
要从主代码访问函数或方法,我们可以执行以下操作,
package main
import (
"fmt"
dm "github.com/kamolhasan/stackOverflow/demo"
)
func main() {
// Now if you want to use the function
// DemoFunc() from demo package
// You can use it like following
value := dm.DemoFunc(34)
fmt.Println(value)
// If you want to use DemoMethod()
// from demo package, you need to declare the object first
// then call the method like following
DB := dm.DataBase{
A: 5,
B: 10,
}
value = DB.DemoMethod(34)
fmt.Println(value)
}
解决问题所需要做的就是声明一个*Database
类型的对象并使用该对象调用该方法。执行以下操作:
var obj db.Database
err := obj.Save(b)
推荐阅读
- .net - 无法从防火墙后面的服务器访问 Firebase
- java - 为什么我的新计算机 windows 10 上的 JLayeredPane 在我的旧计算机上不起作用?
- python - 如何在熊猫中选择不连续的列
- html - 您可以创建一个 HTML 列表,该列表切入包含渐变的 DIV 吗?
- python - 处理文本文件中的单引号
- c# - 具有线程和等待完成的并行 ForEach
- android - Android:识别用户是否是实时构建的测试人员
- sql - 获取Oracle中具有特定值的列范围
- sas - 通过在 SAS 中用另一个前缀替换前缀来动态重命名变量
- node.js - 从节点获取到 laravel