go new() vs make()

lsy·2022년 12월 6일
0

new()

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 할 수 없고, lencap도 0이다.
new()로 생성하면 slice에 대한 자료구조의 공간만 할당되기 때문에 slice에 필요한 참조할 배열은 생성되지 않는다. 따라서 제대로 된 조작이 불가능하다.

make()

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]
profile
server를 공부하고 있습니다.

0개의 댓글