タグが構造体にメタ情報を追加する方法と、それを活用する方法
タグは、構造体フィールドに追加情報を添付する方法です。
のGo仕様構造体タイプの定義タグを次のように定義します
フィールド宣言の後には、オプションの文字列リテラルタグを続けることができます。これは、対応するフィールド宣言のすべてのフィールドの属性になります。空のタグ文字列は、タグがないことと同じです。タグはリフレクションインターフェイスを介して表示され、構造体のタイプIDに参加しますが、それ以外の場合は無視されます。
例を示します。
struct {
x, y float64 "" // an empty tag string is like an absent tag
name string "any string is permitted as a tag"
_ [4]byte "ceci n'est pas un champ de structure"
}
// A struct corresponding to a TimeStamp protocol buffer.
// The tag strings define the protocol buffer field numbers;
// they follow the convention outlined by the reflect package.
struct {
microsec uint64 protobuf:"1"
serverIP6 uint64 protobuf:"2"
}
実際の例
これの一般的なユースケースは、JSONをアンマーシャリングする場合です。Goを使用したJSON処理。
その投稿では、例
type Member struct {
Age int `json:"age,string"`
}
言うjson.Unmarshal()
置くためにage
JSONプロパティ、string
、そしてそれをAge
の分野Member
、に翻訳するint
。この例では、json
カンマで区切られた2つの情報。
タグのフォーマット
タグはkey:"value"
フォーマット。これは厳密な規則ではなく、組み込みの構文解析を提供する規則です。この例では、キーと値のペアは1つしかありませんが、複数持つことができます。
type Member struct {
Age int `json:"age,string" xml:"the_age,string"`
}
慣例によるキーは、ターゲットにするパッケージの名前です。上記の例では、encoding/json
そしてencoding/xml
。
ただし、タグは、標準ライブラリ用に予約されているだけでなく、独自のライブラリでも使用できます。
タグは何に使用されますか?
さまざまなパッケージがさまざまな理由でタグを使用します。
json、xml、bson、yamlなどのライブラリのエンコードだけでなく、ORM /データベースライブラリ、さらにはそれらが使用されていることがわかります。構造体にフォームデータを入力する。
以下のリストが投稿されましたそうそして非常に包括的です:
json
-によって使用されますencoding/json
パッケージ、詳細json.Marshal()
xml
-によって使用されますencoding/xml
パッケージ、詳細xml.Marshal()
bson
- によって使われたゴブソン、詳細はbson.Marshal()
protobuf
- によって使われたgithub.com/golang/protobuf/proto
、パッケージドキュメントで詳しく説明されていますyaml
-によって使用されますgopkg.in/yaml.v2
パッケージ、詳細yaml.Marshal()
db
-によって使用されますgithub.com/jmoiron/sqlx
パッケージorm
-によって使用されますgithub.com/astaxie/beego/orm
パッケージ、詳細モデル– Beego ORMgorm
-によって使用されますgithub.com/jinzhu/gorm
パッケージ、例は彼らのドキュメントで見つけることができます:モデルdatastore
- によって使われたappengine/datastore
(Google App Engineプラットフォーム、データストアサービス)、詳細はプロパティschema
- によって使われたgithub.com/gorilla/schema
を埋めるためにstruct
パッケージドキュメントで詳しく説明されているHTMLフォーム値asn
-によって使用されますencoding/asn1
パッケージ、詳細asn1.Marshal()
そしてasn1.Unmarshal()
野生では他にも多くの使用法があります。例えばmcuadros / go-defaultss itを使用して、構造体フィールドのデフォルト値を設定し、asaskevich / govalidator検証を決定するタグを追加できます(これは検証の1つの可能な方法にすぎません。代替案が存在します)。
fatih / gomodifytags実行時にタグを編集できます。
コードでタグを使用する
独自のコードでタグを使用するには、reflect
パッケージ。
取得してみましょうage
メンバー構造体で。次のコード
package main
import (
“fmt”
“reflect”
)
type Member struct {
Age int something:"age"
}
func main() {
member := Member{34}
t := reflect.TypeOf(member)
field := t.Field(0)
//field, _ := t.FieldByName(“Age”) //alternative
fmt.Print(field.Tag.Get(“something”))
}
印刷しますage
、に固執してくれてありがとうkey:"value"
タグのフォーマット。
その他のチュートリアル:
- NGINXリバースプロキシを使用してGoサービスを提供する
- Goで構造体のコピーを作成する
- GoWebサーバーの基本
- Goでのマップタイプの並べ替え
- 一言で言えばポインタを移動します
- タグの説明に行く
- 日付と時刻のフォーマットに移動
- Goを使用したJSON処理
- 可変個引数関数に移動
- GoStringsチートシート
- GoEmptyインターフェイスの説明
- Go withVSCodeとDelveのデバッグ
- NamedGoはパラメータを返します
- Goで乱数と文字列を生成する
- Goプロジェクトのファイルシステム構造
- Goに実装された二分探索アルゴリズム
- Goでのコマンドラインフラグの使用
- GOPATHの説明
- Goでコマンドラインアプリを作成する:lolcat
- Goを使用したCLIコマンドの作成:cowsay
- Goでのシェルパイプの使用
- CLIチュートリアルに移動:フォーチュンクローン
- Goを使用してフォルダ内のファイルを一覧表示します
- Goを使用して、GitHubからリポジトリのリストを取得します
- 移動し、文字列のスライスをファイルに追加します
- 文字列をバイトスライスに変換します
- GoでローカルGitの貢献を視覚化する
- GoCPUとメモリプロファイリングの開始
- Goプログラムの「インデックス作成をサポートしていません」エラーを解決する
- Goプログラムでの実行時間の測定
- 重複するタイトルを検出するためにGoを使用してWebクローラーを構築する
- ベストプラクティスに進む:ポインターまたは値のレシーバー?
- ベストプラクティスに進む:メソッドまたは関数を使用する必要がありますか?
- データ構造の移動:設定
- マップのチートシートに移動
- Goでジェネリック型の実装を生成する
- Goデータ構造:辞書
- Goデータ構造:ハッシュテーブル
- Go throughChannelsにイベントリスナーを実装する
- Goデータ構造:スタック
- データ構造の移動:キュー
- Goデータ構造:二分探索木
- Goデータ構造:グラフ
- Goデータ構造:リンクリスト
- Goデータ構造の完全ガイド
- Go値の比較
- Goはオブジェクト指向ですか?
- GoでのSQLデータベースの操作
- Goでの環境変数の使用
- チュートリアルに進む:PostgreSQLに裏打ちされたREST API
- GoWebサーバーでのCORSの有効化
- DockerコンテナへのGoアプリケーションのデプロイ
- GoがPHP開発者として学ぶための強力な言語である理由
- 移動し、io.Reader.ReadString改行文字を削除します
- 移動、変更を監視してプログラムを再構築する方法
- 行って、日付からの月を数えます
- GoでHTTPPOSTパラメーターにアクセスする