A. var s []int
B. s := []int(nil)
C. s := []int{}
D. s := make([]int)
위 4가지의 차이는 무엇인가??
1. 차이점
A, B에서 s == nil
C, D에서 s != nil
2. 공통점
A, B, C, D 모두에서 s의 length와 capacity는 0
넷다 바로 append 함수에 쓸 수 있음
3. 디테일
nil인 슬라이스는 length와 capacity가 0이다
그러나 length와 capacity가 0이라고 nil은 아니다
A는 s가 []int 변수라고 선언은 했으나 할당은 없으므로 []int-typed nil
B는 untyped nil을 []int-typed nil로 형변환 한 것을 s에 할당
var s []int = nil도 위의 B와 비슷하게 untyped nil을 s에 할당하는 과정에서 형변환이 일어남
C는 []int 리터럴을 이용해 []int 객체를 만들어 s에 할당, 리터럴에서 아이템이 없으므로 length와 capacity는 0
D는 make를 이용하여 []int 객체를 만들어 s에 할당, make의 두번째 인자와 세번째 인자가 비어있으므로 length와 capacity는 0
참고로 map도 위의 과정들이 마찬가지로 적용
다만 nil에 뭔가를 하려면 사단이 나는 map과 달리
slice는 nil에 대해서도 아무 걱정 없이 append를 사용 가능
아마도 append 함수 내부에서 첫번째 인자로 들어오는 슬라이스 변수가 nil일 경우 따로 처리를 해주는 모양
귀찮아서 소스 찾아보기는 싫다
수정) non-nil 리터럴/객체라는 말 삭제(nli 객체/리터럴이란게 정의상 있을 수가 없는데 결과적으로 s가 nil이 아니란 걸 강조하려다 이상한 표현을 씀.... nil은 타언어의 null pointer에 해당)
댓글 0