登录
首页 >  Golang >  Go问答

返回一个未导入的包中的类型

来源:stackoverflow

时间:2024-03-02 22:42:24 497浏览 收藏

小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《返回一个未导入的包中的类型》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!

问题内容

给出以下三个 go 包(出于隐私原因,我缩写了 imp 和 tdef 的导入路径)

package main

import (
        "imp"
        "fmt"
)

func main() {
        t := imp.newt()
        fmt.printf("t.x = %d\n", t.x)
        fmt.printf("t has type %t\n", t)
}
package imp

import (
        "tdef"
)

func newt() tdef.t {
        return tdef.t{0,0}
}
package tdef

type t struct {
        x int
        y int
}

func (t t) getx() int {
        return t.x
}

main() 产生输出

T.X = 0
T has type Tdef.T

这意味着我可以在包中使用 t 类型的变量,其中 t 的定义通过使用返回值定义是不可见的,并且我可以使用其导出的字段(和方法,此处未显示)。

我觉得这有点令人惊讶,并且在规范中没有找到任何相关信息。话又说回来,我没有太多的编程经验——这是可以预料的吗?使用它是不是不好的做法(请注意,我现在没有现实生活中的例子)?


解决方案


您可以使用来自任何地方的值,但如果没有导入声明,您就无法引用其类型。是的,因为引用标识符需要 qualified identifier,其形式为:

qualifiedident = packagename "." identifier .

您尚未在 main 包中导入 tdef,因此您无法引用类型 tdef.t 标识符(类型),但您没有尝试这样做,所以一切都很好。

Spec: Import declarations:

导入声明指出,包含该声明的源文件取决于导入包 (§Program initialization and execution) 的功能,并且允许访问该包的 exported 标识符。导入命名一个用于访问的标识符 (packagename) 和一个指定要导入的包的 importpath。

您使用了 short variable declaration,因此您没有指定变量的类型(这完全没问题),因此您不需要引用其类型:

t := imp.newt()

t 的类型将从右侧表达式推断出来,当然,这将是 tdef.t ,但是您的源代码不包含对此类型的引用。显然,如果不导入 tdef,以下行将给出编译时错误:

var T Tdef.T = imp.NewT()

您甚至可以从导出函数返回未导出类型的值,导入它的包也可以使用它,例如它可以打印它,调用导出方法并访问未导出类型值的导出字段(尽管返回未导出类型的值被认为是不好的做法,但 golint 会给出如下警告:“exported func xxx returns unexported type pkgname.typename ,使用起来可能很烦人”)。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>