Existem várias respostas / técnicas para a pergunta abaixo:
- Como definir valores padrão para estruturas golang?
- Como inicializar estruturas em golang
Tenho algumas respostas, mas é necessária mais discussão.
go
struct
initialization
default-value
Prateek
fonte
fonte
Respostas:
Uma idéia possível é escrever uma função construtora separada
fonte
NewSomething
e até os camposText
eDefaultText
, mas não exporte o tipo de estruturasomething
.reflect.New()
, por exemplo), não se pode esperar que você saiba sobre sua função de fábrica com nome especial. Nesse caso, e menos que a própria linguagem seja alterada, acho que apenas uma interface (que a biblioteca poderia verificar) faria.Forçar um método para obter a estrutura (a maneira do construtor).
Isso pode ser feito simplesmente tornando o tipo não importado. Você pode exportar a função NewSomething e até os campos Text e DefaultText, mas simplesmente não exporta o tipo de estrutura
Outra maneira de personalizá-lo para o seu próprio módulo é usar uma estrutura Config para definir valores padrão (Opção 5 no link) Não é uma boa maneira.
fonte
Um problema com a opção 1 na resposta de Victor Zamanian é que, se o tipo não for exportado, os usuários do seu pacote não poderão declará-lo como o tipo de parâmetros de função etc. Uma maneira de contornar isso seria exportar uma interface em vez de estrutura, por exemplo
O que nos permite declarar tipos de parâmetros de função usando a interface Candidate exportada. A única desvantagem que vejo desta solução é que todos os nossos métodos precisam ser declarados na definição da interface, mas você pode argumentar que isso é uma boa prática.
fonte
Votes unit32
provavelmente deve serVotes uint32
Existe uma maneira de fazer isso com as tags, que permitem vários padrões.
Suponha que você tenha a seguinte estrutura, com 2 tags padrão default0 e default1 .
Agora é possível definir os padrões.
Aqui está o programa completo em um playground .
Se você estiver interessado em um exemplo mais complexo, digamos, com fatias e mapas, dê uma olhada em creasty / defaultse
fonte
Em https://golang.org/doc/effective_go.html#composite_literals :
Às vezes, o valor zero não é bom o suficiente e é necessário um construtor de inicialização, como neste exemplo, derivado do pacote os.
fonte
fonte