Existen múltiples respuestas / técnicas para la siguiente pregunta:
- ¿Cómo establecer valores predeterminados para estructuras de golang?
- Cómo inicializar estructuras en golang
Tengo un par de respuestas pero se requiere más discusión.
go
struct
initialization
default-value
Prateek
fuente
fuente
Respuestas:
Una idea posible es escribir una función de constructor separada
fuente
NewSomething
e incluso los camposText
yDefaultText
, pero simplemente no exportar el tipo de estructurasomething
.reflect.New()
, por ejemplo), no se puede esperar que sepa sobre su función de fábrica especialmente nombrada. En ese caso, y salvo que se cambie el idioma en sí , creo que solo una interfaz (que la biblioteca podría verificar) funcionaría.Forzar un método para obtener la estructura (la forma del constructor).
Esto se puede hacer simplemente haciendo que el tipo en sí no se exporte. Puede exportar la función NewSomething e incluso los campos Text y DefaultText, pero simplemente no exporte el tipo de estructura algo
Otra forma de personalizarlo para su propio módulo es mediante el uso de una estructura de configuración para establecer los valores predeterminados (opción 5 en el enlace). Sin embargo, no es una buena manera.
fuente
Un problema con la opción 1 en respuesta de Victor Zamanian es que si el tipo no se exporta, los usuarios de su paquete no pueden declararlo como el tipo para los parámetros de función, etc. Una solución sería exportar una interfaz en lugar de struct eg
Lo que nos permite declarar los tipos de parámetros de función utilizando la interfaz Candidate exportada. La única desventaja que puedo ver de esta solución es que todos nuestros métodos deben declararse en la definición de la interfaz, pero podría argumentar que es una buena práctica de todos modos.
fuente
Votes unit32
probablemente debería serVotes uint32
Hay una manera de hacerlo con etiquetas, que permite múltiples valores predeterminados.
Suponga que tiene la siguiente estructura, con 2 etiquetas predeterminadas default0 y default1 .
Ahora es posible establecer los valores predeterminados.
Aquí está el programa completo en un patio de recreo. .
Si está interesado en un ejemplo más complejo, digamos con cortes y mapas, luego, eche un vistazo a creasty / defaultse
fuente
De https://golang.org/doc/effective_go.html#composite_literals :
A veces el valor cero no es lo suficientemente bueno y es necesario un constructor de inicialización, como en este ejemplo derivado del paquete os.
fuente
fuente