Одна из проблем, с вариантом 1 в ответ от Виктора Zamanian в том, что если тип не экспортируется, то пользователи пакета не может объявить его в качестве типа параметров функции и т.д. Один из способов обойти это будет для экспорта интерфейса вместо структуры, например
package candidate
// Exporting interface instead of struct
type Candidate interface {}
// Struct is not exported
type candidate struct {
Name string
Votes unit32 // Defaults to 0
}
// We are forced to call the constructor to get an instance of candidate
func New(name string) Candidate {
return candidate{name, 0} // enforce the default value here
}
Что позволяет нам объявлять типы параметров функции с использованием экспортированного интерфейса кандидата. Единственным недостатком, который я вижу из этого решения, является то, что все наши методы должны быть объявлены в определении интерфейса, но вы можете утверждать, что это хорошая практика в любом случае.
Связанный: [? Как убедиться в том, что метод используется после того, как объект создан в golang] (http://stackoverflow.com/questions/36826232/how-to-make-sure-that- a-method-is-used-after-an-object-is-created-in-golang) – icza
@icza Вы отвечаете, даете предоставить способ сделать это, но, пройдя по заголовку вопроса, он никоим образом не похож или не доступен для поиска так как это очень конкретный вопрос. Однако я добавлю ссылку в свой ответ. – Prateek
Здесь два вопроса, выберите один.Предполагая, что вы выбираете первый вопрос (в соответствии с заголовком вопроса), будьте более конкретным относительно ваших предыдущих исследований и где ваши другие ответы требуют больше обсуждений. –