Подтвердить что ты не робот

Частные поля и методы для структуры

В следующем тестовом коде я хотел бы иметь как 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 должны быть инкапсулированы, а другой тип не должен иметь к ним доступа.

4b9b3361

Ответ 1

Это не то, как "конфиденциальность" работает в Go: грамотность конфиденциальности - это пакет.

Если вам действительно нужны только члены mytype для доступа к некоторым полям, вы должны изолировать структуру и функции в своем собственном пакете.

Но это не обычная практика. Независимо от того, является ли Go ООП или нет, это дискуссионно, но ясно, что практика заключается не в том, чтобы инкапсулировать код структурой, как вы, кажется, хотите сделать. Обычно пакет достаточно мал, чтобы быть последовательным: если вы не хотите получать доступ к полям внутри пакета, не обращайтесь к ним.

Ответ 2

В Go, идентификатор, начинающийся с большой буквы, экспортируется из пакета и может быть доступен любому, кто находится за пределами пакета, который его объявляет.

Если идентификатор начинается с строчной буквы, к нему можно получить доступ только внутри пакета.

Если вам нужны члены в типе, доступ к которым только для членов этого типа, вам необходимо поместить этот тип и его функции-члены в отдельный пакет как единственный тип в этом пакете.

Ответ 3

Вы не можете сделать это в Go. Видимость доступна только на уровне пакета. Но вы можете разделить свой пакет на два.