Go Functional Options Pattern

함수형 옵션 패턴 (Functional Options Pattern) 함수형 옵션 패턴은 함수가 선택적 인수를 허용하는 함수형 프로그래밍 에서 유래했다. 함수형 옵션 패턴을 사용하여 기존 함수 구조를 손상시키지 않고 확장할 수 있는 유여한 인터페이스를 제공한다. Go에서는 구조체를 단순화 하기 위해서 사용하며 서로 다른 매개변수를 가진 많은 생성자를 정의하는 대신 다양한 함수 옵션을 허용하여 단일 생성자를 정의할 수 있다. type ClientOptions struct { Url string Port int Method string } type Option func(*ClientOptions) error func WithUrl(url string) Option { return func(co *ClientOptions) error { co.Url = url return nil } } func WithPort(port int) Option { return func(co *ClientOptions) error { co.Port = port return nil } } func WithMethod(method string) Option { return func(co *ClientOptions) error { co.Method = method return nil } } func NewClient(opts ...Option) (*ClientOptions, error) { var co ClientOptions for _, opt := range opts { err := opt(&co) if err != nil { return nil, err } } return &co, nil } func main() { client, err := NewClient(WithUrl("http://localhost"), WithPort(8080), WithMethod("GET")) if err != nil { panic(err) } log.Println(client.Port) log.Println(client.Url) log.Println(client) } 결론 함수형 옵션 패턴은 가변적인 파라메터가 있을때 생성자 함수의 로직을 단순화 하고 유지 보수성을 높여 줄수 있다. 기존 코드의 변경 없이 옵션을 추가할 수 있으므로 재사용성이 높은 코드를 작성 할 수 있다. ...

March 1, 2024 · 1 min · 210 words · Hillfolk

Go 에서 적합한 리시버 타입의 결정 하기

Go에서 적합한 리시버 타입 결정하기 Go를 사용하다 보면 메서드 리시버로 값을 사용할지, 포인터를 사용할지 고민하는 경우가 많습니다. 최근 읽은 책에서 이에 대해 명확한 기준을 제시한 내용이 있어 공유하려 합니다. 대부분 익숙한 내용일 수 있지만, 이렇게 체계적으로 정리하니 고민을 줄이고 새로운 관점도 얻을 수 있어 유용했습니다. 리시버가 반드시 포인터여야 하는 경우 리시버의 값을 변경해야 하는 경우 가장 단순한 케이스로, 메서드에서 리시버의 값을 수정해야 할 때입니다. 예를 들어, 리시버가 슬라이스인 경우 메서드 내에서 원소를 추가하거나 수정해야 한다면 포인터 리시버가 필요합니다. ...

February 26, 2024 · 2 min · 273 words · Hillfolk