토이 프로젝트로 간단한 리스트 관리 기능을 만들고 있는데, 함수 내부에서 슬라이스에 값을 추가해도 밖에서는 반영이 안 되네요.
코드:
package main
import "fmt"
func addElement(s []int) {
s = append(s, 4)
}
func main() {
nums := []int{1, 2, 3}
addElement(nums)
fmt.Println(nums)
}
오류: [1 2 3] (기대값: [1 2 3 4])
시도: 슬라이스를 포인터로 넘겨야 하는 건지 고민해서 구글링해봤는데 잘 모르겠어요.
질문: 함수 안에서 append를 호출했는데 왜 main 함수에 있는 원본 슬라이스에는 값이 추가되지 않는 건가요?
댓글9
-
빗방울
2026.10.31 13:06
-
빗방울
2026.10.31 14:14
슬라이스 내부 구조 보면 len이랑 cap 값이 따로 노는 거라 그런 듯요ㅋㅋ
공식 문서에서 slice header 부분 한번 읽어보세요. 이해 확 됨ㄷㄷ
-
빗방울
2026.10.31 14:47
맞음ㅋㅋ
그거 모르면 계속 뇌정지 옴ㄷㄷ
헤더 개념 잡아야 Go 좀 칠 수 있는 듯요
-
빗방울
2026.10.31 15:15
걍 `s = addElement(s)` 이렇게 리턴값 받는 게 제일 깔끔함ㅋㅋ
포인터 쓰면 코드 더 지저분해져서 보통 그렇게 칠 거예요.
-
빗방울
2026.10.31 16:04
용량(cap) 꽉 찼을 때 새로운 메모리 할당되는 거 생각하면 진짜 킹받죠ㅋㅋ
전 처음에 이거 때문에 며칠 헤맸음ㄷㄷ
그냥 맘 편하게 리턴값 받는 습관 들이는 게 정신건강에 이롭네요.
-
빗방울
2026.10.31 17:44
이거 나중에 slice header 값 복사되는 거 보면 더 킹받을걸요ㅋㅋ
그냥 처음부터 슬라이스 말고 맵이나 다른 구조 쓰는 게 편할 때도 있는 듯요.
-
빗방울
2026.10.31 20:01
이거 Go 언어 특유의 얕은 복사 때문에 그런 거임ㅋㅋ
그냥 `append` 결과값 다시 받아 쓰는 게 국룰이라
그렇게 하는 게 제일 속 편하실 듯요ㄷㄷ
-
빗방울
2026.10.31 20:58
아예 처음부터 슬라이스 말고 맵으로 짜보시는 건 어떠신지ㅋㅋ 리스트 관리면 맵이 더 편할 때도 있더라고요.
-
빗방울
2026.10.31 22:10
아 ㅋㅋㅋ 이거 진짜 처음 보면 뇌정지 오는 구간임
차라리 처음부터 `make`로 cap 넉넉하게 잡고 테스트해보세요.
그럼 또 결과 다르게 나와서 더 킹받을 수도 있긴 함ㅋㅋ
모든 이야기1450
가벼운 안부부터 깊은 생각까지, 함께 나눠요.
이거 고 언어 처음 할 때 다들 겪는 킹받는 포인트임ㅋㅋ 리턴값으로 받아서 다시 할당하거나 포인터 써야 될듯요.