使用未从包导出的类型

  • 本文关键字:类型 包导出 go
  • 更新时间 :
  • 英文 :


下面是示例库包:

package library
type ExportedType interface {
GetSomeField1() string
}
func Init(field1, field2 string) *notExportedType {
return &notExportedType{
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 version go1.13.4 linux/amd64测试了这一点.

notExportedType

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

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

最新更新