PHpullh

GO · 함수

defer 심화

defer는 LIFO(후입선출) 순서로 함수 종료 시 실행됩니다. 리소스 정리와 잠금 해제에 필수적입니다.

함수중급deferLIFOmutexresource-cleanup

핵심 설명

defer는 LIFO(후입선출) 순서로 함수 종료 시 실행됩니다. 리소스 정리와 잠금 해제에 필수적입니다.

Go code

package main

import (
	"fmt"
	"sync"
)

func deferOrder() {
	fmt.Println("시작")
	defer fmt.Println("첫 번째 defer")
	defer fmt.Println("두 번째 defer")
	defer fmt.Println("세 번째 defer") // 가장 먼저 실행
	fmt.Println("끝")
}

// 실전: 뮤텍스 잠금 해제
type SafeMap struct {
	mu sync.Mutex
	m  map[string]int
}

func (s *SafeMap) Set(key string, val int) {
	s.mu.Lock()
	defer s.mu.Unlock() // 함수 종료 시 자동 해제
	s.m[key] = val
}

func main() {
	deferOrder()
	// 출력: 시작, 끝, 세 번째, 두 번째, 첫 번째

	sm := &SafeMap{m: make(map[string]int)}
	sm.Set("count", 42)
	fmt.Println(sm.m)
}

학습 팁

defer는 Lock/Unlock, Open/Close 쌍을 가까이 배치하여 실수를 방지합니다. 잠금 직후 바로 defer Unlock()을 작성하세요.

주의할 점

루프 안에서 defer를 사용하면 루프가 끝나야 실행됩니다. 리소스가 누적될 수 있으므로 루프 내에서는 즉시 해제하거나 별도 함수로 분리하세요.

자주 묻는 질문

defer 심화란 무엇인가요?

defer 는 LIFO(후입선출) 순서로 함수 종료 시 실행됩니다. 리소스 정리와 잠금 해제에 필수적입니다.

defer 심화 학습 시 주의할 점은 무엇인가요?

루프 안에서 defer 를 사용하면 루프가 끝나야 실행됩니다. 리소스가 누적될 수 있으므로 루프 내에서는 즉시 해제하거나 별도 함수로 분리하세요.

Continue Learning

Go 학습을 이어가세요

총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.