티스토리 뷰

Go

구조체(Struct)에 대해서

Miles 2021. 1. 13. 16:17

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 개체로 필드값이 변할 경우 새 객체를 만들지 않고 해당 객체 메모리에서 변경된다. 하지만 이 객체를 파라미터로 넘기면 객체를 복사해서 전달하게 된다. 전달받은 함수에서 객체를 수정하기 위해서는 객체의 포인터를 전달해야 한다.

💡
Zero value
정수인 경우 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: 여러 타입 설정

 

댓글
공지사항
최근에 올라온 글
Total
Today
Yesterday
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함