Golang(Go) 배열에 포함하는지 확인하는 함수 (generics)
20220511 베경
신청하는 API 를 만들었다. 기관이 물품을 신청할 때 신청 가능한지 확인하는 코드가 존재한다. 이때 물품의 사업 분야와 기관의 사업 분야가 존재하며 물품의 사업분야에 기관의 사업분야가 포함되어야 신청 할 수 있다.
작업 내용
물품의 사업 분야가 복수 일 때 기관의 사업 분야가 포함하는지 확인
코드
func Contains(items []string, key string) bool { for _, item := range items { if item == key { return true } } return false}
if goods.BusinessField != "*" && org.BusinessField != goods.BusinessField { return errors.ApiInternalServerError(fmt.Sprintf(errors.MessageParamsNotSame+"(사업분야:%d)", org.BusinessField))} else if goods.BusinessRegion != "00" && org.BusinessRegion != goods.BusinessRegion { check := false goodsBusinessFields := strings.Split(goods.BusinessField, ",") orgBusinessFields := strings.Split(org.BusinessField, ",") for _, orgBusinessField := range orgBusinessFields { if common.Contains(goodsBusinessFields, orgBusinessField) { check = true break } } if !check { return errors.ApiInternalServerError(fmt.Sprintf(errors.MessageParamsNotSame+"(기관의 사업분야:%d)", org.BusinessField)) }}
- 20221102
func StringSliceContains(s []string, e string) bool { for _, a := range s { if a == e { return true } } return false}
func Int64SliceContains(s []int64, e int64) bool { for _, a := range s { if a == e { return true } } return false}
- Go 1.18+ 부터는 generics 사용이 가능하다!
func Contains[T comparable](s []T, e T) bool { for _, v := range s { if v == e { return true } } return false}
https://stackoverflow.com/questions/10485743/contains-method-for-a-slice
20221209
if err != nil {return err}
코드를 go 작업하면서 자주 쓴다 그래서 반복되는 코드를 함수로 만들고 utils 에 저장하고 사용한다
장점은 해당 코드는 3줄인데 아래처럼 1줄로 줄일 수 있다
utils.HandlerErr(err)
function으로 작업을 하면서 반환값에 boolean 이나 int 등 값또한 전달하는 상황이 있었다
id 로 값을 조회하는 function 의 경우 반환값은 error 와 boolean 이다
// go 1.18 이후 제네릭 함수 사용 가능
func HandleErr[T any](err error, b T) (error, T) { if err != nil { return err, b } return nil, nil}
여기서 문제는
이 코드를 쓰면 아래와 같이
cannot use nil as T value in return statement
에러가 발생한다
타입이 T 인데 nil 을 반환해서 문제가 발생했다
func HandleErr[T any](err error, b T) (error, T) { if err != nil { return err, b } return nil, b}
이렇게 코드를 고쳤고
다시 테스트 케이스 커버를 확인하면서
return nil,b
를 커버 못하는 것을 확인했다
그해서 아래처럼 변수에 할당을 해서 모든 코드가 실행되도록 수정하니 coverage 100 이 될 수 있었다
func HandleErrWithWant[T any](e error, w T) (error, T) { var err error if e != nil { err = e } return err, w}