【问题标题】:How to correctly import method from another package如何从另一个包中正确导入方法
【发布时间】:2018-07-03 07:54:20
【问题描述】:

我有以下简单的项目:

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

类似的组合和编译器说“未定义的引用”仍然......

所以,我的问题是:如何在这种情况下正确使用另一个包中的方法?当然,我的方法以大写字母开头并导出。如果我尝试使用具有相同名称(而不是方法)的简单函数,那么它可以正常工作...

【问题讨论】:

    标签: go methods import packages


    【解决方案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").Print undefined(类型B没有打印字段或方法)

    规范清楚地说明了type declarations section的区别

    type B A 行是一个类型定义:

    类型定义创建一个新的不同类型,具有相同的 底层类型和操作作为给定类型,并绑定一个 它的标识符。

    虽然type C = A 行是一个别名声明:

    别名声明将标识符绑定到给定类型。

    前者是一个新类型,所以方法Print()的接收者类型A不会匹配B的类型。 后者只是一个指向类型A的名称。

    您需要使用类型别名将代码更改为以下内容:

    import t myapp/tables
    
    type tableName = t.TableName
    
    tableName("string").GetDataFromDataSource()
    

    还有一些注意事项:

    • t.GetDataFromDataSource()不行,是方法,需要receiver
    • t.tableName("string").GetDataFromDataSource() 不起作用,t.tableName 不是一个东西,或者如果是,它不会被导出
    • 你不能谈论导入方法,只导入包。方法要么导出,要么不导出,但它是你导入的包

    【讨论】:

      猜你喜欢
      • 2020-11-29
      • 1970-01-01
      • 2020-02-24
      • 1970-01-01
      • 1970-01-01
      • 2013-01-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      相关资源
      最近更新 更多