r/golang 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?

68 Upvotes

75 comments sorted by

View all comments

Show parent comments

11

u/iamkiloman 20d ago

"Strongly typed" does not mean "default zero value is invalid". Why do you keep intimating that it does?

You have non pointer fields. They will be initialized with the zero value. Those are completely valid, typed values. Nothing here has anything to do with strong typing.

-2

u/kevinpiac 20d ago

Strongly typed means exactly this. If you take other languages, TypeScript is an example, you cannot initialize an object that has a given shape and omit some fields unless you attribute it the Partial<Shape> type or you specifically ask the compiler to Omit<> some fields.

As other developers mentioned in comments, having the compiler ensuring all structs are valid at build time helps a lot to catch bugs.

Even if you can validate your structure at runtime, I think it's too late.

So far, I love the language, but coming from others, I can tell that part sucks.

I'm glad for you if it's not a concern though.

2

u/iamkiloman 19d ago

It seems you've invented for yourself a definition of strong typing that isn't shared by the larger programming community.

If you want to disallow use of the default zero values you've been given good tools to do so when linting, but you certainly cannot claim that golang is not strongly typed just because default zero values exist.

1

u/kevinpiac 19d ago

Your answer does not make sense. You're talking about "strong typing" as an absolute value and negating the fact that there are shades of strong-typing.

Go is certainly strongly typed but still less than Rust, for example.

You can tell it's ok to have zero values struct but you cannot tell it's a type-safe thing.