구조체(Struct)에 대해서
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 개체로 필드값이 변할 경우 새 객체를 만들지 않고 해당 객체 메모리에서 변경된다. 하지만 이 객체를 파라미터로 넘기면 객체를 복사해서 전달하게 된다. 전달받은 함수에서 객체를 수정하기 위해서는 객체의 포인터를 전달해야 한다.
정수인 경우 0, float인 경우 0.0, string인 경우 "", 포인터인 경우 nil 등
태그
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: 여러 타입 설정