🔥 타입 파라미터

338자
4분

Go 언어에서는 제네릭(Generic) 함수를 사용하여 다양한 타입에 대해 유연하게 작업할 수 있습니다. 제네릭 함수의 타입 파라미터는 함수 인자 앞에 대괄호([]) 안에 작성합니다.

func Index[T comparable](s []T, x T) int
 
go

위의 선언은 scomparable 제약 조건을 충족하는 어떤 타입 T의 슬라이스임을 의미합니다. x 또한 동일한 타입의 값입니다.

comparable은 유용한 제약 조건으로, ==!= 연산자를 사용하여 값을 비교할 수 있게 해줍니다. 이 예제에서는 일치하는 값을 찾을 때까지 슬라이스의 모든 요소와 값을 비교하는 데 사용됩니다. 이 Index 함수는 비교를 지원하는 모든 타입에 대해 동작합니다.

package main
 
import "fmt"
 
// Index returns the index of x in s, or -1 if not found.
func Index[T comparable](s []T, x T) int {
	for i, v := range s {
		// v and x are type T, which has the comparable
		// constraint, so we can use == here.
		if v == x {
			return i
		}
	}
	return -1
}
 
func main() {
	// Index works on a slice of ints
	si := []int{10, 20, 15, -10}
	fmt.Println(Index(si, 15))
 
	// Index also works on a slice of strings
	ss := []string{"foo", "bar", "baz"}
	fmt.Println(Index(ss, "hello"))
}
 
go

위의 코드에서 Index 함수는 다음과 같이 동작합니다:

  1. Index 함수는 제네릭 타입 파라미터 T를 사용하여 선언되었습니다. 이는 Tcomparable 제약 조건을 충족해야 함을 의미합니다.
  2. 함수는 타입 T의 슬라이스 s와 타입 T의 값 x를 매개변수로 받습니다.
  3. for 루프를 사용하여 슬라이스 s의 각 요소 v와 인덱스 i를 순회합니다.
  4. 각 반복에서 vx를 비교하여 일치하는 값을 찾습니다. vxcomparable 제약 조건을 충족하므로 == 연산자를 사용할 수 있습니다.
  5. 일치하는 값이 발견되면 해당 인덱스 i를 반환합니다.
  6. 슬라이스 전체를 순회한 후에도 일치하는 값이 없으면 -1을 반환합니다.

main 함수에서는 Index 함수를 다양한 타입의 슬라이스에 적용하여 사용하는 방법을 보여줍니다:

  1. 정수 슬라이스 si에 대해 Index 함수를 호출하여 값 15의 인덱스를 찾습니다.
  2. 문자열 슬라이스 ss에 대해 Index 함수를 호출하여 값 "hello"의 인덱스를 찾습니다. 이 경우 "hello"는 슬라이스에 존재하지 않으므로 -1을 반환합니다.

이렇게 제네릭 함수를 사용하면 코드의 중복을 줄이고 다양한 타입에 대해 유연하게 작업할 수 있습니다. 제네릭 함수는 타입 안전성을 유지하면서도 코드의 재사용성을 높여줍니다.