프로그래밍Go 개발자

Go에서 선택적 매개변수 및 기본값 사용의 특징과 최소한의 경직성을 가진 함수의 유연한 인터페이스 구현에 대해 설명하십시오.

Hintsage AI 어시스턴트로 면접 통과

답변.

Go는 근본적으로 선택적 매개변수 및 기본값을 함수 인수에 대해 지원하지 않으며, 각 함수는 그 신호에 지정된 인수 집합만을 받습니다. 이는 모델의 전반적인 단순성과 코드의 예측 가능성 때문에 취해진 프로젝트의 결정입니다.

문제의 역사

Python이나 C++와 같은 다른 언어에서는 선택적/기본 매개변수가 함수의 동작을 유연하게 정의할 수 있게 해줍니다. Go에서는 읽기와 명확성을 위해 이를 포기했습니다.

문제

API를 유연하게 만들고 싶을 때, 기본값을 단순히 설정하는 것이 불가능합니다. 모든 매개변수를 명시적으로 전달하거나 우회적인 패턴을 사용해야 합니다. 이는 많은 옵션을 지원하는 것을 복잡하게 만들고 오버로드된 함수의 수를 증가시킬 수 있습니다.

해결책

Go에서 그러한 유연성을 위해 두 가지 접근 방식을 사용합니다:

  1. 매개변수 구조체 - 옵션 필드 집합으로 구조체를 생성하여 함수를 통해 전달할 수 있습니다. 구조체 내부에서 기본값을 명시적으로 설정할 수 있습니다.
  2. 가변 함수 (functional options pattern) - 객체의 구성 설정을 변경하는 설정 함수 전달 패턴입니다.

구조체를 통한 접근 방식의 예:

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에서는 함수 오버로드가 지원되지 않으며, 다른 시그니처를 가진 중복된 함수 이름은 허용되지 않습니다.

일반적인 오류 및 안티 패턴

  • 가변 인터페이스(...interface{})를 통해 오버로드를 구현하려고 하여 복잡한 타입 검사를 수동으로 수행
  • API를 수십 개의 매개변수로 불필요하게 확장하여 지원이 어려워짐
  • 함수 내부에 값을 하드코딩하여 설정할 수 있는 가능성 없음

실생활 예

부정적인 사례

API 함수가 수십 개의 매개변수를 가지고 있으며, 그 중 많은 수가 동일한 타입으로, 실수로 순서로 혼란을 초래합니다:

장점:

  • 모든 것이 명시적으로 정의됨

단점:

  • 명확하지 않은 인수로 인한 오류
  • 기본값이 무엇인지 불명확함

긍정적인 사례

옵션 구조체 또는 기능적 옵션이 사용되며, 매개변수에 명시적 이름이 있습니다:

장점:

  • 유연하고 확장 가능한 시그니처
  • 모호함 없이 기본값 지원이 가능함

단점:

  • 추가적인 "랩핑" (구조체, 옵션 함수)를 유지해야 함