Вот пример пакета библиотеки:
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
функция в библиотека . И я получил неинтуитивный результат с использованием краткого объявления переменной:
- Почему я могу достичь метода , а не экспортированного типа и его поля (
record2.GetSomeField2()
и record2.SomeField1
)? - Это стандарт поведения для go компилятора или это удачный случай и может быть изменен в другой версии?
Я тестирую это с go version go1.13.4 linux/amd64
.