Hello everyone!
I’m writing a new library where I need to be able to configure a struct. This
struct and its configuration will be accessed concurrently. One design pattern
I see throughout the standard library and community is to make the struct and
its configuration fields public but all other fields private.
e.g.
type MyServer struct {
ConfigureMe int
usedInternally string
}
This nicely complements Go’s default values and is very terse to use. This is
exactly how structs such as http.Server and autocert.Manager (part of the new
acme library) are used.
As aforementioned, the configuration fields in my struct need to be accessed
concurrently. My issue is that since the configuration fields are public, they
can be freely mutated by a package user and so a race condition may occur. I’m
not sure how big of an issue this is considering its very unlikely that someone
will mutate the struct once its being used but the design feels a bit fragile
to me.
In search of a better way, I thought about using a config struct but then I
found Dave Cheney’s post
https://dave.cheney.net/2014/10/17/functional-options-for-friendly-apis
<https://dave.cheney.net/2014/10/17/functional-options-for-friendly-apis> about
using functional options and now I’m thinking of using those. However, I
haven’t seen this API design used anywhere at all in any library I have ever
used (or in the standard library at all) so I was wondering whether or not it’s
idiomatic.
I’m not sure if I’m being overly pedantic in my criticism of having the
configuration fields public in the struct. I don’t have too many configuration
fields so maybe functional options will be overkill.
I’m not really sure what I should go with now and I’ve hit a mental block with
my design. I’m hoping someone will have some thoughts on what approach I should
go with.
Thanks!
--
You received this message because you are subscribed to the Google Groups
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.