Hi
I would suggest to use the second option. If you export all possible
members, you have to care on every redesign who and how this members are
used. This makes a redesign unnecessarily tricky.
Constructor functions are a common pattern in go code and therefore you
should not flinch to use it. For testing you can append "_test" to the
package name and then your test can't see any non exportet members of your
package.
Cheers
Sandro
Am Donnerstag, 9. August 2018 09:50:55 UTC+2 schrieb Jay G:
>
> Let's say I'm writing some library for internal usage in my project,
> what's the idiomatic way to design visibility of struct members?
>
> - Option 1. export structs and members as much as possible. Only hide
> ones that need to be protected, e.g. by a lock
> - Option 2. hide as much as possible. Only export when necessary
>
> *Opt 1 makes testing easier when written in separate pkg. Also we don't
> rely on constructors to inject dependencies*
> *Opt 2 defines a clearer API, and prevent users from accessing unnecessary
> fields, which could be prone of error*
>
>
> Is constructor actually anti-pattern in Go?
>
> type Foo struct {
> A A
> B B
> }
>
>
> func main() {
> _ := &Foo{A: myA, B: myB}
> }
>
> vs
>
> type Foo struct {
> a A
> b B
> }
>
>
> func NewFoo(a A, b B) *Foo {
> return &Foo{a: a, b: b}
> }
>
>
> func main() {
> _ := NewFoo(myA, myB)
> }
>
>
> thanks a lot!
> - J
>
--
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.