Go는 근본적으로 선택적 매개변수 및 기본값을 함수 인수에 대해 지원하지 않으며, 각 함수는 그 신호에 지정된 인수 집합만을 받습니다. 이는 모델의 전반적인 단순성과 코드의 예측 가능성 때문에 취해진 프로젝트의 결정입니다.
Python이나 C++와 같은 다른 언어에서는 선택적/기본 매개변수가 함수의 동작을 유연하게 정의할 수 있게 해줍니다. Go에서는 읽기와 명확성을 위해 이를 포기했습니다.
API를 유연하게 만들고 싶을 때, 기본값을 단순히 설정하는 것이 불가능합니다. 모든 매개변수를 명시적으로 전달하거나 우회적인 패턴을 사용해야 합니다. 이는 많은 옵션을 지원하는 것을 복잡하게 만들고 오버로드된 함수의 수를 증가시킬 수 있습니다.
Go에서 그러한 유연성을 위해 두 가지 접근 방식을 사용합니다:
구조체를 통한 접근 방식의 예:
type QueryOptions struct { Limit int Offset int } func QueryDB(opts QueryOptions) { if opts.Limit == 0 { opts.Limit = 10 // 기본값 } // ... } QueryDB(QueryOptions{Limit: 100})
또는 기능 옵션을 통해:
type Config struct { Timeout int } type Option func(*Config) func WithTimeout(t int) Option { return func(cfg *Config) { cfg.Timeout = t } } func Do(opts ...Option) { cfg := Config{Timeout: 5} // 기본값 for _, o := range opts { o(&cfg) } // ... } Do(WithTimeout(10)) // 옵션과 함께 호출 Do() // 기본값과 함께 호출
주요 특징:
예를 들어 func F(a int = 10)와 같이 함수 선언 시 기본값을 설정할 수 있습니까?
아니요, Go에서는 그러한 구문을 선언할 수 없습니다. 요구되는 매개변수의 엄격한 목록만 가능합니다.
...interface{} 유형의 슬라이스로 함수를 선언하고 인수를 0개 전달하면 어떤 일이 발생합니까?
슬라이스의 길이는 0(널)이 되며, 함수는 빈 슬라이스를 받습니다.
코드 예:
func PrintAll(args ...interface{}) { fmt.Println(len(args)) // 매개변수를 전달하지 않으면 0 } PrintAll() // ok
Go에서 매개변수의 수나 타입에 따라 함수를 오버로드(overload)할 수 있습니까?
아니요, Go에서는 함수 오버로드가 지원되지 않으며, 다른 시그니처를 가진 중복된 함수 이름은 허용되지 않습니다.
API 함수가 수십 개의 매개변수를 가지고 있으며, 그 중 많은 수가 동일한 타입으로, 실수로 순서로 혼란을 초래합니다:
장점:
단점:
옵션 구조체 또는 기능적 옵션이 사용되며, 매개변수에 명시적 이름이 있습니다:
장점:
단점: