반응형
자신의 방법을 정의하는 Is또 다른 용도는 다른 인스턴스의 오류를 비교하는 것입니다. 동일한 필드 오류가 있는 특정 필터 인스턴스를 일치시키도록 지정하여 고유한 오류를 패턴 일치시킬 수 있습니다. 다음은 오류 유형을 정의합니다 ResourceErr.
type ResourceErr struct {
Resource string
Code int
}
func (re ResourceErr) Error() string {
return fmt.Sprintf("%s: %d", re.Resource, re.Code)
}
임의의 필드가 설정되었을 때 두 인스턴스를 일치시키려면 ResourceErr사용자 정의 메소드를 작성할 수 있습니다 Is.
func (re ResourceErr) Is(target error) bool {
if other, ok := target.(ResourceErr); ok {
ignoreResource := other.Resource == ""
ignoreCode := other.Code == 0
matchResource := other.Resource == re.Resource
matchCode := other.Code == re.Code
return matchResource && matchCode ||
matchResource && ignoreCode ||
ignoreResource && matchCode
}
return false
}
이때 예를 들어 코드가 무엇이든 모든 오류가 데이터베이스를 가리킨다는 것을 알 수 있습니다.
if errors.Is(err, ResourceErr{Resource: "Database"}) {
fmt.Println("The database is broken:", err)
// process the codes
}
여기서 이해가 안됬던건, is를 재정의 했고, 이걸 쓰는 시점이 언젠지가 이해가 안갔따.
errors.Is( v1, v2 ) 이렇게 파라미터 2개를 받는데, 재정의는 파라미터를 1개를 받는다, 뭔가 자바의 오버라이딩도 아니고 이해가 안갔는데,
Is 함수의 원 본체를 찾고 이해했음
func Is(err, target error) bool {
if target == nil {
return err == target
}
isComparable := reflectlite.TypeOf(target).Comparable()
for {
if isComparable && err == target {
return true
}
if x, ok := err.(interface{ Is(error) bool }); ok && x.Is(target) {
return true
}
// TODO: consider supporting target.Is(err). This would allow
// user-definable predicates, but also may allow for coping with sloppy
// APIs, thereby making it easier to get away with them.
if err = Unwrap(err); err == nil {
return false
}
}
}
x.Is(target)
위의 이부분이 재정의한걸 쓰는거다.
러닝Go 중국어 사이트
https://zhuanlan.zhihu.com/p/618498397
반응형
'Web > GoLang' 카테고리의 다른 글
[golang] time 타입 parsing 오류 (parsing time "~~~" as "~~~": cannot parse "~~~" as "~~~") (0) | 2023.08.22 |
---|---|
[gorm] many2many Association 관계 (0) | 2023.08.16 |
[golang] makefile , gomodule 에 대한 윈도우 사용 후기와 makefile 설정 리뷰 (0) | 2023.05.05 |
[Grpc ] grpc k8s kubernetes 관련 내용 (0) | 2023.01.30 |
Golang의 문자열에서 개행 문자를 제거하는 방법 \r\n \n (0) | 2023.01.10 |
댓글