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 // 함수 밖으로 나가므로 → 힙에 할당됨
}
구조체가 함수에서 만들어졌지만, 함수 밖에서도 사용되어야 하면 힙에 할당된다.