개발 지식

개발 지식

Go for-range에서 slice를 수정하면 생기는 이상한 버그

페이지 정보

profile_image
영삼이
0건 114회 25-03-28 15:06

본문

✅ for-range에서 slice를 수정하면 생기는 이상한 버그

반복 중 수정은 패닉보다 무섭다

Go에서 for-range는 편하게 쓸 수 있다:

nums := []int{1, 2, 3}
for i, v := range nums {
	fmt.Println(i, v)
}

하지만 반복문 도중에 slice를 수정하면
예상치 못한 결과가 발생할 수 있다.


❌ 문제 상황: 반복 중 append

list := []string{"a", "b", "c"}
for i, v := range list {
	list = append(list, v + "_copy")
	if i > 5 {
		break
	}
}
fmt.Println(list)
  • append로 인해 slice 용량이 동적으로 늘어남

  • range는 초기 길이까지만 순회하지만

  • 내부적으로는 예측 불가능한 동작 가능 (중복, 무한 루프 등)


✅ 해결: 반복 중에는 절대 수정 금지

  • 수정이 필요하면 새 slice에 복사해서 작업

  • 또는 인덱스 기반 for 루프로 명확하게 제어

original := []string{"a", "b", "c"}
copied := make([]string, len(original))
copy(copied, original)

for _, v := range copied {
	original = append(original, v+"_copy")
}

✔️ for-range는 안전하지만 불변일 때만 안전하다.
반복 중 수정은 피하고, 변경이 필요하다면
복사 후 처리하는 습관을 들이자.

댓글목록

등록된 댓글이 없습니다.