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

영삼이
본문
✅ 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
는 안전하지만 불변일 때만 안전하다.
반복 중 수정은 피하고, 변경이 필요하다면
복사 후 처리하는 습관을 들이자.
- 이전글인터페이스는 덕 타이핑이라고? 그게 함정이 될 수도 있다 25.03.28
- 다음글채널(channel)이 무조건 안전하진 않다 25.03.28
댓글목록
등록된 댓글이 없습니다.