我有以下简单的项目:
myapp/
|- mainlib/main.go
|- tables/sometable.go
在sometable.go我有:
package tables
import (
"fmt"
)
type TableName string
func (table TableName) GetDataFromDataSource() string {
return "getdatafromdatasource"
}
这些是方法,现在我想在main.go中使用它们:
package main
import t myapp/tables
type tableName t.TableName // and such "attempts"
我试过了:
t.GetDataFromDataSource()
t.tableName("string").GetDataFromDataSource()
tableName("string").GetDataFromDataSource()
和类似的组合和编译器说“未定义的引用”仍然......
所以,我的问题是:如何在这样的上下文中正确使用来自另一个包的方法?当然,我的方法以captial字母开头并导出。如果我尝试使用具有相同名称的简单函数(不是方法),那么它可以正常工作......
答案 0 :(得分:1)
这与包无关,但与别名声明和类型定义无关。
我们举一个简单的例子:
type A string
func (a A) Print() {
fmt.Println(a)
}
type B A
type C = A
func main() {
A("A").Print()
B("B").Print()
C("C").Print()
}
无法使用以下代码在B("B").Print()
上编译
B(“B”)。打印未定义(类型B没有字段或方法打印)
该规范清楚地说明了type declarations section
的差异第type B A
行是一种类型定义:
类型定义创建一个具有相同的新的不同类型 作为给定类型的基础类型和操作,并绑定 它的标识符。
虽然行type C = A
是别名声明:
别名声明将标识符绑定到给定类型。
前者是新类型,因此方法A
的接收器类型Print()
与类型B
不匹配。
后者只是一个指向A
类型的名称。
您需要使用类型别名将代码更改为以下内容:
import t myapp/tables
type tableName = t.TableName
tableName("string").GetDataFromDataSource()
还有几点说明:
t.GetDataFromDataSource()
无法正常工作,这是一种方法,需要接收器t.tableName("string").GetDataFromDataSource()
不起作用,t.tableName
不是一个东西,或者如果是,它不会被导出