Go에서 태그 만들기

Jay Singh 2023년1월30일
  1. Go에서 struct 함수를 사용하여 태그 만들기
  2. Go에서 JSON을 사용하여 태그 만들기
Go에서 태그 만들기

구조체라고도 하는 구조체는 여러 데이터 비트를 단일 엔터티로 결합합니다. 이러한 데이터 세트는 집 번호, 거리, 도시, 주 및 우편 번호로 구성된 주소와 같은 상위 수준 개념을 정의합니다.

struct 태그를 사용하여 데이터베이스나 API와 같은 시스템에서 이 정보를 읽을 때 구조체의 필드에 이 정보가 할당되는 방식을 조절할 수 있습니다. Struct 태그는 구조체의 필드에 연결된 짧은 메타데이터로, 구조체와 상호 작용하는 다른 Go 코드에 지침을 제공합니다.

이것은 구조체에 메타 데이터를 추가하는 방법입니다. 패키지 또는 타사 응용 프로그램에서 데이터를 활용하여 특정 작업을 수행하거나 데이터를 적절하게 처리하는 방법을 결정할 수 있습니다.

이 메타 데이터는 공백으로 구분되며 key: value 형식의 문자열 리터럴을 사용하여 선언됩니다. 동일한 필드에 여러 태그가 존재하여 고유한 목적과 라이브러리를 제공합니다.

이 튜토리얼은 Go의 struct 기능을 사용하여 태그를 생성하는 방법을 보여줍니다.

Go에서 struct 함수를 사용하여 태그 만들기

이 예에서는 이름 필드가 있는 User 유형이 정의됩니다. namestruct 태그가 이름 열에 추가되었습니다.

예 1:

package main

import "fmt"

type User struct {
    Name string `example:"name"`
}

func (u *User) String() string {
    return fmt.Sprintf("Hello, I am %s", u.Name)
}

func main() {
    u := &User{
    Name: "Jay Singh",
    }

    fmt.Println(u)
}

출력:

Hello, I am Jay Singh

태그에 액세스하고 사용하려면 reflect 패키지를 사용해야 합니다.

기존 형식을 사용하는 경우 StructTagGetLookup 메서드를 사용하여 태그에 대한 정보에 액세스할 수 있습니다. Lookup 메소드는 필드에서 태그를 찾았는지 여부를 나타내는 ok 값도 반환합니다.

예 2:

package main

import (
    "fmt"
    "reflect"
)

type User struct {
    Name  string `color:"white"`
    Age   int    `color:"black"`
    Email string
}

func main() {
    a := User{"Jay", 99, "example@jay.com"}

    ut := reflect.TypeOf(a)
    for i := 0; i < ut.NumField(); i++ {
        field := ut.Field(i)
        if color, ok := field.Tag.Lookup("color"); ok {
            if color == "" {
                fmt.Println("(blank)")
            } else {
                fmt.Println(color)
            }
        } else {
            fmt.Println("(Not Specified)")
        }
    }
}

출력:

white
black
(Not Specified)

Go에서 JSON을 사용하여 태그 만들기

표준 라이브러리의 JSON 인코더는 struct 태그를 주석으로 사용하여 JSON 출력에서 ​​필드 이름을 지정하는 방법을 인코더에 알려줍니다. encoding/json 패키지에는 이러한 JSON 인코딩 및 디코딩 메커니즘이 포함되어 있습니다.

JSON이 struct 태그 없이 인코딩되는 방법을 이해하려면 다음 예제를 시도하십시오.

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "os"
    "time"
)

type User struct {
    Name      string
    Password  string
    Address   []string
    CreatedAt time.Time
}

func main() {
    a := &User{
    Name:      "Jay Singh",
    Password:  "qwertyuiop",
    CreatedAt: time.Now(),
    }

    out, err := json.MarshalIndent(a, "", "  ")
    if err != nil {
        log.Println(err)
        os.Exit(1)
    }

    fmt.Println(string(out))
}

출력:

{
    "Name": "Jay Singh",
    "Password": "qwertyuiop",
    "Address": null,
    "CreatedAt": "2022-03-10T23:00:00Z"
}