new()는 메모리에 공간을 할당하여 주소(포인터)를 return한다. 이 때 공간에는 지정한 type의 zero value가 저장된다.
func main() {
a := new(int)
fmt.Println(a)
}
0xc0000b8000
a에는 주소가 저장됐으므로, 주소가 출력된다.
func main() {
a := new(int)
fmt.Println(*a)
}
0
값을 출력하면 int의 zero value인 0이 출력된다.
func main() {
a := new(chan int)
fmt.Println(*a)
}
<nil>
chan int의 zero value는 nil이므로 nil이 출력된다.
그렇다면 struct는 어떨까?
type sample struct {
a int
f float32
c chan int
s string
}
func main() {
a := new(sample)
fmt.Println(a)
}
&{0 0 <nil> }
struct도 똑같다. 그만큼의 공간을 만든 다음 zero value를 할당한다.
slice는 어떨까?
func main() {
a := new([]int)
fmt.Println(a)
fmt.Println(len(*a), cap(*a))
}
&[]
0 0
slice는 만들어지긴 하지만, 값을 append 할 수 없고, len과 cap도 0이다.
new()로 생성하면 slice에 대한 자료구조의 공간만 할당되기 때문에 slice에 필요한 참조할 배열은 생성되지 않는다. 따라서 제대로 된 조작이 불가능하다.
chan, slice, map을 사용하려면 new()만으로 해결되지 않는다. 이 type들의 zero value는 nil이고, 특정 자료구조를 사용하므로 사용하려면 초기화가 필요하다.
이 때 make()을 활용한다. make()은 해당 type을 사용할 수 있도록 초기화한다. 그리고 주소(포인터)가 아닌 값을 할당한다.
func main() {
a := make([]int, 5)
fmt.Println(a)
}
[0 0 0 0 0]