제네릭 프로그래밍은 타입 파라미터를 통해서 하나의 함수나 타입이 여러 타입들에 대해서 동작할 수 있도록 하여 코드 재사용성을 늘리는 기법.
Go 1.18 버전부터 새롭게 추가
생각하는 Go 언어 프로그래밍 : Go 제네릭의 이해 - 골든래빗
사용 예시
아래와 같이 제네릭 타입을 인터페이스로 정의하고
(타입 제한을 하기 위해 사용한다.)
type RedisValue interface {
LoginValue | Key | string
/*
커스텀 타입 추가할수있다:<https://velog.io/@excellent/Tutorial-Getting-started-with-generics>
*/
}
type Key struct {
Name string
}
type LoginValue struct {
QueueName string `json:"queueName"`
TokenString string `json:"tokenString"`
Jti string `json:"jti"`
}
함수의 매개변수는 다음과 같이 선언할 수 있다.
func SetWithoutTTL**[T RedisValue]**(db int, command, key string, **value T**) error {
//value는 redisUtil.LoginValue 타입이거나... 향후에 또 다른 타입이 될 수도 있음
dbnumstr := strconv.Itoa(db)
jsonBody, err := json.Marshal(value)
if err != nil {
return err
}
bodyReader := bytes.NewReader(jsonBody)
req, err := http.NewRequest("POST", "<http://localhost>:레디스포트번호/search?db="+dbnumstr+"&command="+command+"&key="+key, bodyReader)
if err != nil {
return err
}
client := &http.Client{}
_, respErr := client.Do(req)
if respErr != nil {
return respErr
}
return nil
}
package main
**type Integer interface { // ❶ 타입 제한
int8 | int16 | int32 | int64 | int
}**
func add[T Integer](a, b T) T { // ❷ add() 함수 정의
return a + b
}
type MyInt int // ❸ 별칭 타입 정의
func main() {
add(1, 2)
var a MyInt = 3
var b MyInt = 5
add(a, b) // ❹ 에러 발생
}
아래와 같이 물결표시를 앞에다가 붙임으로써 개선가능하다.
package main
**type Integer interface { // ❶ 타입 제한
~int8 | ~int16 | ~int32 | ~int64 | ~int
}**
func add[T Integer](a, b T) T { // ❷ add() 함수 정의
return a + b
}
type MyInt int // ❸ 별칭 타입 정의
func main() {
add(1, 2)
var a MyInt = 3
var b MyInt = 5
add(a, b) // 정상 작동
}