Let's say I have a struct like this:
type MyService struct {
name string
region string
environment string
}
If there are many fields in the struct, I can set them using pointer receivers:
func (m *MyService) Name(name string) {
m.name = name
}
func (m *MyService) Region(region string) {
m.region = region
}
The other option, I have seen in 3rd party libraries or SDK's, is:
type MyServiceLoadOptions func(service *MyService) error
And set fields like:
func WithRegion(region string) MyServiceLoadOptions {
return func(service *MyService) error {
service.region = region
return nil
}
}
func WithName(name string) MyServiceLoadOptions {
return func(service *MyService) error {
service.name = name
return nil
}
}
And get it like:
myService, err = MyServiceNew(WithName("newName"), WithRegion("us-east-1"))
func MyServiceNew(options ...MyServiceLoadOptions) (*MyService, error) {
service := &MyService{}
for _, option := range options {
err := option(service)
if err != nil {
return nil, err
}
}
return service, nil
}
What is the advantage of using function loader vs pointer receiver to set fields?
I see the latter option used in AWS Golang SDK's.