Использование неэкспортированного типа из пакета - PullRequest
0 голосов
/ 14 января 2020

Вот пример пакета библиотеки:

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.

1 Ответ

3 голосов
/ 14 января 2020

notExportedType не является неэкспортированным типом, это неэкспортированное имя. Таким образом, вы не можете объявить новый экземпляр этого типа вне пакета. Если у вас есть экземпляр этого типа notExportedType, вы все равно можете получить доступ к экспортированным полям и методам этого типа. Это стандартное и указанное поведение. Экспорт относится только к имени.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...