Go 使用未从包导出的类型

Go 使用未从包导出的类型,go,Go,以下是示例库包: package library type ExportedType interface { GetSomeField1() string } func Init(field1, field2 string) *notExportedType { return &notExportedType{ SomeField1: field1, someField2: field2, } } type notExport

以下是示例库包:

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)
}
主程序包
进口(
“fmt”
“/图书馆”
)
func main(){
var record1 library.ExportedType=library.Init(“记录1字段1”、“记录1字段2”)
fmt.Println(record1.GetSomeField1())

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