如何从另一个包

时间:2018-01-24 10:02:55

标签: go methods import packages

我有以下简单的项目:

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字母开头并导出。如果我尝试使用具有相同名称的简单函数(不是方法),那么它可以正常工作......

1 个答案:

答案 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不是一个东西,或者如果是,它不会被导出
  • 你不能谈论导入方法,只导入包。方法是否导出,但它是您导入的包