登录
首页 >  Golang >  Go问答

访问未导出的包中类型

来源:stackoverflow

时间:2024-02-21 19:54:29 256浏览 收藏

有志者,事竟成!如果你在学习Golang,那么本文《访问未导出的包中类型》,就很适合你!文章讲解的知识点主要包括,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

这是示例库包:

package library

type exportedtype interface {
    getsomefield1() string
}

func init(field1, field2 string) *notexportedtype {
    return ¬exportedtype{
        somefield1: field1,
        somefield2: field2,
    }
}

type notexportedtype struct {
    somefield1 string
    somefield2 string
}

func (t *notexportedtype) getsomefield1() string {
    return t.somefield1
}

func (t *notexportedtype) getsomefield2() string {
    return t.somefield2
}

这里是我如何使用它:

package main
import (
    "fmt"
    "./library"
)

func main() {
    var record1 library.ExportedType = library.Init("record1 field1", "record1 field2")
    fmt.Println(record1.GetSomeField1())
//  fmt.Println(record1.GetSomeField2())   <- undefined (type library.ExportedType has no field or method GetSomeField2)
//  fmt.Println(record1.SomeField1)        <- undefined (type library.ExportedType has no field or method SomeField1)
//  _ = record1.(*library.notExportedType) <- cannot refer to unexported name library.notExportedType


    record2 := library.Init("record2 field1", "record2 field2")
    fmt.Println(record2.GetSomeField1())
    fmt.Println(record2.GetSomeField2())
    fmt.Println(record2.SomeField1)
//  fmt.Println(record2.someField2)         <- undefined (cannot refer to unexported field or method someField2)
}

我在库中导出 exportedtype 接口类型和 init 函数。 我使用短变量声明得到了不直观的结果:

  1. 为什么我可以实现导出类型的方法及其字段(record2.getsomefield2()record2.somefield1)?
  2. 这是 go 编译器的行为标准还是幸运的情况,可以在不同版本中更改?

我使用 go 版本 go1.13.4 linux/amd64 进行测试。


解决方案


notExportedType 不是未导出的类型,它是未导出的名称。因此,您不能在包外部声明该类型的新实例。如果您有此 notExportedType 类型的实例,您仍然可以访问该类型的导出成员字段和方法。这是标准和指定的行为。导出仅适用于名称。

https://golang.org/ref/spec#Exported_identifiers

今天关于《访问未导出的包中类型》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

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