Go

Go의 구조체

Justin입니다. 2025. 6. 8. 11:24

 

Go에서는 구조체(Struct)의 인스턴스를 만들 때 Type{} 혹은 new(Type)을 사용한다.

type Person struct {
    name string
    age  int
}

func main() {
    // ① 값 타입 인스턴스
    p1 := Person{name: "Alice", age: 30}

    // ② 포인터 타입 인스턴스
    p2 := new(Person)
    p2.name = "Bob"
    p2.age = 40

    fmt.Println(p1)          // {Alice 30}
    fmt.Println(*p2)         // {Bob 40}
}

- new(Person)은 *Person 타입을 반환한다 (포인터 인스턴스)

- Person{}은 값 복사되며 구조체 전체가 스택에 할당된다.

 

 

new(Person) - 포인터 타입 인스턴스

p := new(Person)

new(Person)은 메모리 공간을 동적으로 할당하고, 그 주소를 리턴한다.

p의 타입은 *Person이다. 즉, Person 구조체를 가리키는 포인터이다.

 

Person{} - 값 타입 인스턴스

p := Person{name: "Bob", age: 20}

- person{}은 구조체 자체를 생성한다. 변수 p는 구조체 값을 그대로 가진다.

이 경우 구조체는 복사가능한 값 타입으로 동작한다.

함수에 전달하면 기본적으로 복사본이 전달된다.

func modify(p Person) {
    p.name = "Changed"  // 복사본 변경, 원본에는 영향 없음
}

 

 

아래의 코드를 보자

func makePerson() *Person {
    p := Person{"Bob", 40}  // 여기선 스택에 만들어졌지만
    return &p               // 함수 밖으로 나가므로 → 힙에 할당됨
}

구조체가 함수에서 만들어졌지만, 함수 밖에서도 사용되어야 하면 힙에 할당된다.