1. 구조체
구조체는 필드들의 집합이며, Go
에서 Custom Data Type
을 표현하는데 사용된다. Go
는 객체 지향 프로그래밍(Object Oriented Programming, OOP)
언어가 가지는 클래스, 객체, 상속이 없지만, 구조체로 클래스와 같은 Custom Type
을 정의할 수 있다. 하지만, OOP
의 클래스는 기본 메서드를 갖지만 Go
의 구조체는 기본 메서드를 가지지 않는다.
2. 사용법
예를 들어, 사람은 이름과 나이를 가질 수 있다. 여기서 사람이 구조체가 되고 이름, 나이는 필드가 되는 것이다. 그리고 Go에서 구조체의 이름과 필드 이름의 첫 글자를 대문자로 하면 다른 패키지에서도 사용할 수 있다.
// 구조체
type person struct {
// 필드
name string
age int
}
// 내보내기
type Person struct {
Name string
Age int
}
또한, 구조체를 타입으로 가지는 변수를 생성하거나 Go의 내장함수인 new()
를 사용하여 객체로 생성할 수 있다.
// 구조체를 타입으로 가지는 변수 생성
// 1
var p1 Person
p1 = person{"Miles", 19}
// 2
p2 := person{name: "Miles", age: 19}
1번처럼 객체를 생성할 경우 필드 수 만큼 값을 입력해야 하지만, 2번처럼 객체를 생성하면 입력되지 않은 값은 Zero value를 갖는다.
// Go의 내장함수 new()를 사용하여 생성
p := new(person)
p.name = "Miles"
new()
를 사용하면 모든 필드가 Zero value로 초기화하고 person
객체의 포인터를 반환한다.
Go
에서 구조체는 기본적으로 mutable
개체로 필드값이 변할 경우 새 객체를 만들지 않고 해당 객체 메모리에서 변경된다. 하지만 이 객체를 파라미터로 넘기면 객체를 복사해서 전달하게 된다. 전달받은 함수에서 객체를 수정하기 위해서는 객체의 포인터를 전달해야 한다.
태그
Go
의 구조체에서 태그를 사용하여 json
으로 사용할 때의 이름과 xml
로 사용할 때 이름을 다르게 설정할 수 있다.
package main
import (
"fmt"
"encoding/json"
)
// json 필드명 변경
type Person struct {
Name string `json:"person_name"`
Age int `json:"person_age"`
}
func main() {
p := Person{
Name: "Miles",
Age: 19,
}
json, _ := json.Marshal(p)
fmt.Print(string(json))
}
// output
{
"person_name": "miles",
"person_age": 19
}
또한, 출력되지 말아야 하는 내용이 있다면 하이픈(-
)를 이용하여 출력하지 않게 하거나 omitempty
를 추가하여 값이 비었을 경우 출력하지 않게 할 수 있다.
package main
import (
"fmt"
"encoding/json"
)
type Person struct {
Name string `json:"person_name"`
Age int `json:"person_age"`
ResidentRegistrationNumber string `json:"-"` // 출력 X
Job string `json:"person_job,omitempty"` // 값이 없을 때 출력 X
}
func main() {
p := Person{
Name: "Miles",
Age: 19,
ResidentRegistrationNumber: "123456-1234567",
Job: "",
}
json, _ := json.Marshal(p)
fmt.Print(string(json))
}
// output
{
"person_name": "miles",
"person_age": 19
}
객체에 omitempty
의 속성을 주는 경우 포인터를 사용하여 nil
이 되어야 출력이 되지 않는다.
주로 사용되는 태그는 다음과 같다.
- json, xml, bson, protobuf, yaml, asn, csv: Encoding 필드 이름, 속성 설정
- db, orm, gorm, datastore, schema: Column 이름, 속성 설정
- default: 초기 값 설정
- valid: 값 검증(이메일, 전화번호, 카드 번호 등)
- types: 여러 타입 설정