Частные поля и методы для структуры
В следующем тестовом коде я хотел бы иметь как mytype
, так и doPrivate
метод private, так что только члены mytype
могут получить к нему доступ, но не другие типы\функции в области mypackage
пакет.
Могу ли я сделать это в golang?
package mypackage
type mytype struct {
size string
hash uint32
}
func (r *mytype) doPrivate() string {
return r.size
}
func (r *mytype) Do() string {
return doPrivate("dsdsd")
}
Поля size
и hash
, а также метод doPrivate
должны быть инкапсулированы, а другой тип не должен иметь к ним доступа.
Ответы
Ответ 1
Это не то, как "конфиденциальность" работает в Go: грамотность конфиденциальности - это пакет.
Если вам действительно нужны только члены mytype
для доступа к некоторым полям, вы должны изолировать структуру и функции в своем собственном пакете.
Но это не обычная практика. Независимо от того, является ли Go ООП или нет, это дискуссионно, но ясно, что практика заключается не в том, чтобы инкапсулировать код структурой, как вы, кажется, хотите сделать. Обычно пакет достаточно мал, чтобы быть последовательным: если вы не хотите получать доступ к полям внутри пакета, не обращайтесь к ним.
Ответ 2
В Go, идентификатор, начинающийся с большой буквы, экспортируется из пакета и может быть доступен любому, кто находится за пределами пакета, который его объявляет.
Если идентификатор начинается с строчной буквы, к нему можно получить доступ только внутри пакета.
Если вам нужны члены в типе, доступ к которым только для членов этого типа, вам необходимо поместить этот тип и его функции-члены в отдельный пакет как единственный тип в этом пакете.
Ответ 3
Вы не можете сделать это в Go. Видимость доступна только на уровне пакета. Но вы можете разделить свой пакет на два.