GO · 에러처리
fmt.Errorf %w 심화
%w 동사의 동작 원리와 Go 1.20+ 다중 래핑을 이해합니다.
에러처리중급errorfwrapmulti-wrapgo120
핵심 설명
%w 동사의 동작 원리와 Go 1.20+ 다중 래핑을 이해합니다.
Go code
package main
import (
"errors"
"fmt"
)
var (
ErrAuth = errors.New("인증 실패")
ErrPerm = errors.New("권한 없음")
)
func main() {
// 단일 래핑
err1 := fmt.Errorf("로그인: %w", ErrAuth)
fmt.Println(errors.Is(err1, ErrAuth)) // true
// Go 1.20+: 다중 래핑
err2 := fmt.Errorf("접근 거부: %w, %w", ErrAuth, ErrPerm)
fmt.Println(errors.Is(err2, ErrAuth)) // true
fmt.Println(errors.Is(err2, ErrPerm)) // true
// %v vs %w
err3 := fmt.Errorf("에러: %v", ErrAuth) // 래핑 안 됨
fmt.Println(errors.Is(err3, ErrAuth)) // false
err4 := fmt.Errorf("에러: %w", ErrAuth) // 래핑됨
fmt.Println(errors.Is(err4, ErrAuth)) // true
// 중첩 래핑
inner := fmt.Errorf("DB: %w", ErrAuth)
outer := fmt.Errorf("서비스: %w", inner)
fmt.Println(errors.Is(outer, ErrAuth)) // true (체인 탐색)
}학습 팁
Go 1.20부터 fmt.Errorf에 %w를 여러 번 사용하여 다중 에러를 래핑할 수 있습니다.
주의할 점
%v는 에러를 문자열로만 변환하므로 errors.Is/errors.As로 추적할 수 없습니다. 체인이 필요하면 %w를 사용하세요.
자주 묻는 질문
fmt.Errorf %w 심화란 무엇인가요?
%w 동사의 동작 원리와 Go 1.20+ 다중 래핑을 이해합니다.
fmt.Errorf %w 심화 학습 시 주의할 점은 무엇인가요?
%v 는 에러를 문자열로만 변환하므로 errors.Is / errors.As 로 추적할 수 없습니다. 체인이 필요하면 %w 를 사용하세요.
Continue Learning
Go 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.