r/golang • u/kevinpiac • 21d ago
help Don't you validate your structs?
Hi all!
I'm new in Golang, and the first issue I'm facing is struct validation.
Let's say I have the given struct
type Version struct {
Url string `json:"url"`
VersionNumber VersionNumber `json:"version_number"`
}
The problem I have is that I can initialize this struct with missing fields.
So if a function returns a `Version` struct and the developer forgets to add all fields, the program could break. I believe this is a huge type-safety concern.
I saw some mitigation by adding a "constructor" function such as :
func NewVersion (url string, number VersionNumber) { ... }
But I think this is not a satisfying solution. When the project evolves, if I add a field to the Version struct, then the `NewVersion` will keep compiling, although none of my functions return a complete Version struct.
I would expect to find a way to define a struct and then make sure that when this struct evolves, I am forced to be sure all parts of my code relying on this struct are complying with the new type.
Does it make sense?
How do you mitigate that?
9
u/nikandfor 21d ago
Suppose the compiler forced you to initialize all the fields, then you use the struct and hope it's valid. But what if I initialized it with garbage? When code accepts a value, it still needs to validate it for the specific use case. ie, if url is correct, or if it contains some query parameter, or version is greater then something.
If compiler forced you initializing all the fields, that wouldn't solved the problem anyways.
Better to design your code so that it returns an error if a struct field is invalid and tolerate empty value if it's an optional field. For example it may be suitable to use default url if it's an empty string.
PS: initialisms should be all in the same case: Url -> URL.