더북(TheBook)

new() 함수로 구조체 포인터 생성

new() 함수는 제로값으로 초기화된 구조체를 생성한 후 생성된 구조체의 메모리 주소가 담긴 포인터를 반환한다.

item := new(Item)
item.name = "Men's Slim-Fit Shirt"
 
item.price = 25000
item.quantity = 3
 
fmt.Println(item)        // &{Men's Slim-Fit Shirt 25000 3}
fmt.Println(item.Cost()) // 75000

구조체 포인터에도 구조체 타입에 정의된 메서드를 호출할 수 있다.

 

구조체 포인터 생성 방법 비교

구조체의 포인터를 생성하는 방법은 다음 두 가지이다.

new(Type)
&Type{}

두 구문 모두 주어진 타입에 맞는 메모리 공간을 할당해 제로값으로 초기화한 후 새로 만들어진 메모리의 주소를 반환한다.

구조체 포인터를 &Type{}로 생성하면 초깃값이 할당된 구조체의 포인터를 생성할 수 있어서 활용도가 높다.

포인터를 초기화할 때 주소 연산자(&)를 사용하는 코드와 new 함수를 사용하는 코드를 비교해 보자.

type rect struct{ w, h float64 }
 
r1 := rect{1, 2}
r2 := new(rect)
r2.w, r2.h = 3, 4
r3 := &rect{}
r4 := &rect{5, 6}
 
fmt.Println(r1) // {1 2}
fmt.Println(r2) // &{3 4}
fmt.Println(r3) // &{0 0}
fmt.Println(r4) // &{5 6}

r2r3, r4 포인터를 보면 new(Type) ≡ &Type{}가 성립한다는 것을 알 수 있다.

 

익명 구조체

구조체를 타입으로 정의하지 않고 익명으로 사용할 수도 있다.

rects := []struct{ w, h int }{{1, 2}, {}, {-1, -2}}
for _, r := range rects {
    fmt.Printf(”(%d, %d) “, r.w, r.h)
}

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.