Difference between pointer receiver and load func

Viewed 64

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.

0 Answers
Related