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]