Go でタグを作成する
構造体は、構造体とも呼ばれ、複数のデータビットを 1つのエンティティに結合します。これらのデータセットは、番地、番地、番地、市区町村、都道府県、郵便番号で構成される住所などの上位レベルの概念を定義します。
struct
タグを使用して、データベースや API などのシステムから情報を読み取るときに、この情報が構造体のフィールドにどのように割り当てられるかを調整できます。struct
タグは、構造体のフィールドに接続されたメタデータの短いビットであり、構造体と相互作用する他の Go コードに指示を提供します。
これは、構造体にメタデータを追加する方法です。パッケージまたはサードパーティのアプリケーションがデータを利用して、特定のアクションを実行する方法やデータを適切に処理する方法を決定できます。
このメタデータはスペースで区切られ、key: value
の形式の文字列リテラルを使用して宣言されます。同じフィールドに複数のタグが存在し、明確な目的とライブラリを提供します。
このチュートリアルでは、Go の struct
関数を使用してタグを作成する方法を示します。
Go の struct
関数を使用してタグを作成する
この例では、Name フィールドを持つ User
タイプが定義されています。name
列に Name
の struct
タグが追加されました。
例 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
パッケージを使用する必要があります。
従来の形式を使用する場合は、StructTag
の Get
および Lookup
メソッドを使用して、タグに関する情報にアクセスできます。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 エンコードおよびデコードメカニズムが含まれています。
struct
タグなしで JSON がどのようにエンコードされるかを理解するには、次の例を試してください。
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"
}