[go] Go 언어에서 디폴트(default) 매개 변수

Go 언어는 매개 변수(parameter)에 기본값을 설정할 수 있는 기능을 제공하지 않습니다. 따라서 함수에서 매개 변수를 정의할 때 기본값을 명시적으로 지정해주어야 합니다. 하지만 Go 언어에서는 몇 가지 방법을 통해 디폴트 매개 변수와 비슷한 기능을 구현할 수 있습니다.

방법 1: 매개 변수에 빈 값 할당

함수의 매개 변수를 정의할 때 해당 타입의 빈 값으로 초기화합니다. 예를 들어, 정수형 매개 변수의 디폴트 값을 0으로 설정할 수 있습니다.

func foo(bar int) {
    // 매개 변수가 전달되지 않았을 때, bar는 0으로 초기화됨
    fmt.Println(bar)
}

func main() {
    foo(10)    // 10 출력
    foo()      // 0 출력
}

하지만 이 방법은 해당 타입이 원시 타입(primitive type)일 때만 유효하며, 구조체(struct)나 배열(array)과 같은 복합 타입의 매개 변수에는 사용할 수 없습니다.

방법 2: 매개 변수 구조체 활용

구조체를 사용하여 매개 변수에 디폴트 값을 지정할 수 있습니다. 예를 들어, 다음과 같이 구조체를 정의하여 디폴트 값을 설정할 수 있습니다.

type Options struct {
    Foo int
    Bar string
}

func foo(opts Options) {
    // opts.Foo와 opts.Bar에 값이 할당되지 않았을 때,
    // Foo는 0, Bar는 빈 문자열로 초기화됨
    fmt.Println(opts.Foo, opts.Bar)
}

func main() {
    foo(Options{Foo: 10, Bar: "hello"})  // 10 hello 출력
    foo(Options{})                       // 0  출력
}

이 방법은 모든 타입에 대해 디폴트 값을 지정할 수 있으며, 정보를 구조화하여 전달할 수 있다는 장점이 있습니다.

방법 3: 함수 오버로딩 사용

Go 언어는 함수의 오버로딩(overloading)을 지원하지 않지만, 함수명을 다르게 지정하여 같은 이름의 함수를 여러 개 정의할 수 있습니다. 매개 변수가 하나도 전달되지 않았을 때, 디폴트 값을 사용하는 함수를 다른 함수로 정의할 수 있습니다.

func foo() {
    fmt.Println("디폴트 값 사용")
}

func fooWithParam(bar int) {
    fmt.Println(bar)
}

func main() {
    foo()             // 디폴트 값 사용 출력
    fooWithParam(10)  // 10 출력
}

이 방법은 가독성이 좋지 않을 수 있으며, 매개 변수의 개수와 타입이 많아질수록 코드의 중복이 발생할 수 있습니다.

결론

Go 언어에서 디폴트 매개 변수를 지원하지 않지만, 빈 값 할당, 매개 변수 구조체 활용, 함수 오버로딩을 통해 비슷한 효과를 얻을 수 있습니다. 매개 변수의 개수와 종류에 따라 가장 적합한 방법을 선택하여 사용하면 됩니다.


참조: