본문 바로가기
프로그래밍/Golang

Golang 함수 []any(슬라이스 파라미터) 와 ...any(가변인자)

by slowin 2024. 8. 8.

개요

Go 언어에서 함수를 정의할 때 []any와 ...any는 모두 여러 개의 값을 받을 수 있는 파라미터를 나타내지만, 사용 방법과 의미에 차이가 있습니다. 두 방식의 차이점을 자세히 살펴보겠습니다.

[]any

[]any는 'any' 타입의 슬라이스를 나타냅니다.
 

  • 정의: func someFunc(params []any) { ... }
  • 호출: someFunc([]any{1, "hello", true})

특징: 함수에 전달할 때 반드시 슬라이스로 만들어서 전달해야 합니다.

...any

...any는 가변 인자를 나타냅니다.
 

  • 정의: func someFunc(params ...any) { ... }
  • 호출: someFunc(1, "hello", true) 또는 someFunc([]any{1, "hello", true}...)

 
특징:

  1. 함수 호출 시 개별 인자로 전달하거나, 슬라이스를 펼쳐서(spread) 전달할 수 있습니다.
  2. 함수 내부에서는 슬라이스처럼 다룰 수 있습니다.
  3. 항상 함수의 마지막 파라미터로만 사용할 수 있습니다.
    1. 마지막에 위치 하지 않으면, `Can only use '...' as the final argument in the list` 의 메시자가 노출됩니다.

1. 가변 인수 함수

Go에서는 함수의 인수가 고정된 갯수가 아니더라도 유동적으로 여러 개를 받을 수 있습니다. 이처럼 가변인수를 받기위해서 ... 문법을 사용할 수 있습니다. 이 문법을 사용하면 함수의 인수로 여러 값을 전달할 수 있으며, 이러한 인수는 슬라이스 형태로 전달됩니다.
 

package main

import (
    "fmt"
)

func printNumbers(numbers ...int) {
    for _, number := range numbers {
        fmt.Println(number)
    }
}

func main() {
    printNumbers(1, 2, 3, 4, 5)
}

 

2. 슬라이스를 가변 인수로 전달

함수 호출 시 슬라이스를 가변 인수로 전달할 때는 `...` 문법을 사용하여 슬라이스의 요소를 개별 인수로 변환할 수 있습니다.

package main

import (
    "fmt"
)

func printNumbers(numbers ...int) {
    for _, number := range numbers {
        fmt.Println(number)
    }
}

func main() {
    nums := []int{1, 2, 3, 4, 5}
    printNumbers(nums...) // 슬라이스의 요소를 개별 인수로 전달
}

이 문법은 함수의 유연성을 높이고, 다양한 입력값을 처리할 때 매우 유용합니다.
 

정리

Go 언어에서 함수의 파라미터로 여러 값을 받을 수 있는 두 가지 주요 방법인 []any와 ...any의 차이점을 살펴보았습니다.

  • []any:
    • 슬라이스를 사용하여 함수에 여러 값을 전달합니다.
    • 함수 정의 시 []any 타입의 슬라이스를 받아야 하며, 호출 시에는 슬라이스를 생성하여 전달해야 합니다.
  • ...any:
    • 가변 인자를 사용하여 함수에 여러 개의 값을 직접 전달할 수 있습니다.
    • 함수 정의 시 ...any를 사용하며, 함수 호출 시 개별 인수로 전달하거나 슬라이스를 펼쳐서 전달할 수 있습니다.
    • 함수 내부에서는 가변 인자가 슬라이스처럼 다루어질 수 있으며, 가변 인자는 함수의 마지막 파라미터로만 사용할 수 있습니다.