이 글은 Effective Go를 일부 번역한 글입니다.


자료

new로 할당하기

Go엔 두 가지 할당 기본 요소(Primitive)가 있다. 내장 함수 new와 make다. 둘은 다르게 동작하며 적용되는 유형이 다르다. 혼란스러울 수 있지만, 규칙은 간단하다. new부터 얘기해 보자. new는 메모리를 할당하는 내장 함수다. 하지만 다른 언어에서 하던 것과는 다르게 메모리를 초기 값으로 설정하진 않는다. 단순히 0 값으로 만들 뿐이다. new(T)는 새로운 T 형 항목에 맞는 저장 공간을 할당하고 0 값으로 만들어 그 주소를 *T 형 값으로 반환한다. Go 용어로는, 새로 할당한 T 형의 0 값을 가리키는 포인터를 반환한다.

new가 메모리를 0 값으로 만들어 반환하기 때문에 자료 구조를 설계할 때 각 형의 0 값을 초기 설정 없이 바로 사용하도록 만드는 게 도움이 될 것이다. 이러면 해당 자료 구조 사용자는 new로 하나 만들고 바로 사용할 수 있다. 예로 bytes.Buffer 문서를 보면 “Buffer의 0 값은 바로 사용할 수 있는 빈 버퍼다.”라 쓰여 있다. 비슷하게 sync.Mutex는 생성자나 init 메서드를 명시하는 대신 0 값을 풀린 뮤텍스로 정의했다.

0 값이 유용하단 속성은 옮도록 되어 있다. 이 형 선언을 생각해 보자.

type SyncedBuffer struct {
    lock    sync.Mutex
    buffer  bytes.Buffer
}

SyncedBuffer 형도 할당이나 선언 후에 바로 값을 사용할 수 있다. 아래 토막에서 p와 v 모두 추가 설정 없이 바르게 작동할 것이다.

p := new(SyncedBuffer)  // type *SyncedBuffer
var v SyncedBuffer      // type  SyncedBuffer