🔥 타입 파라미터
338자
4분
Go 언어에서는 제네릭(Generic) 함수를 사용하여 다양한 타입에 대해 유연하게 작업할 수 있습니다. 제네릭 함수의 타입 파라미터는 함수 인자 앞에 대괄호([]) 안에 작성합니다.
go
func Index[T comparable](s []T, x T) int
go
func Index[T comparable](s []T, x T) int
위의 선언은 s가 comparable 제약 조건을 충족하는 어떤 타입 T의 슬라이스임을 의미합니다. x 또한 동일한 타입의 값입니다.
comparable은 유용한 제약 조건으로, ==와 != 연산자를 사용하여 값을 비교할 수 있게 해줍니다. 이 예제에서는 일치하는 값을 찾을 때까지 슬라이스의 모든 요소와 값을 비교하는 데 사용됩니다. 이 Index 함수는 비교를 지원하는 모든 타입에 대해 동작합니다.
go
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
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"))
}
위의 코드에서 Index 함수는 다음과 같이 동작합니다:
Index함수는 제네릭 타입 파라미터T를 사용하여 선언되었습니다. 이는T가comparable제약 조건을 충족해야 함을 의미합니다.- 함수는 타입
T의 슬라이스s와 타입T의 값x를 매개변수로 받습니다. for루프를 사용하여 슬라이스s의 각 요소v와 인덱스i를 순회합니다.- 각 반복에서
v와x를 비교하여 일치하는 값을 찾습니다.v와x는comparable제약 조건을 충족하므로==연산자를 사용할 수 있습니다. - 일치하는 값이 발견되면 해당 인덱스
i를 반환합니다. - 슬라이스 전체를 순회한 후에도 일치하는 값이 없으면 -1을 반환합니다.
main 함수에서는 Index 함수를 다양한 타입의 슬라이스에 적용하여 사용하는 방법을 보여줍니다:
- 정수 슬라이스
si에 대해Index함수를 호출하여 값 15의 인덱스를 찾습니다. - 문자열 슬라이스
ss에 대해Index함수를 호출하여 값 "hello"의 인덱스를 찾습니다. 이 경우 "hello"는 슬라이스에 존재하지 않으므로 -1을 반환합니다.
이렇게 제네릭 함수를 사용하면 코드의 중복을 줄이고 다양한 타입에 대해 유연하게 작업할 수 있습니다. 제네릭 함수는 타입 안전성을 유지하면서도 코드의 재사용성을 높여줍니다.











