PHpullh
학습 라이브러리/Go/fmt.Errorf %w 심화

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 를 사용하세요.