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}
r2와 r3, 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) }