go 시리즈
go는 포인터의 라이프타임이 데이터보다 더 긴 경우, 해당 데이터를 자동으로 힙에 할당해준다. 이를 클로져라고 한다.
예를 들어 이 함수는 클로져를 반환하고, 이 때 클로져의 라이프타임은 fib() 함수의 두 지역변수를 포함하기 때문에 go 컴파일러는 이 두 변수를 힙에 할당한다. 모든 클로저가 포함하는 () 것은 변수의 값이 아니라 변수의 참조/포인터 이다. 따라서 c 언어 등에서는 클로져를 반환할 때 dangling pointer같은 문제가 발생하는 것이다. 슬라이스를 초기화 하지 않으면 nil이다. 그러나 초기화 했지만 아무 원소도 없는 empty slice일 수도 있다.
중요한 건 두 경우 모두 len이 0이라는 점이다. make로 슬라이스를 만들 때 cap을 지정하지 않으면 언제까지고 append할 수 있다.
그러나 cap을 지정한 경우에는 cap 이상으로는 append하더라도 변하지 않는다. 가장 헷갈리는점 : nil map에 무언가를 insert하면 에러가 나지만 n…