필드에 대한 태그를 사용하면 리플렉션을 사용하여 획득 할 수있는 메타 정보를 필드에 첨부 할 수 있습니다. 일반적으로 구조체 필드가 다른 형식으로 인코딩되거나 디코딩되는 방법 (또는 데이터베이스에서 저장 / 검색)에 대한 변환 정보를 제공하는 데 사용되지만 원하는 메타 정보를 다른 용도로 저장하는 데 사용할 수 있습니다. 패키지 또는 자신의 사용.
의 문서에서 언급했듯이 reflect.StructTag
, 규칙에 따라 태그 문자열의 값은 공백으로 구분 된 key:"value"
쌍의 목록입니다 . 예를 들면 다음과 같습니다.
type User struct {
Name string `json:"name" xml:"name"`
}
은 key
일반적으로 후속하는 패키지이다 "value"
예를 들면위한 json
키 처리 /에 의해 사용되는 encoding/json
패키지.
에 여러 정보를 전달해야하는 "value"
경우 일반적으로 정보를 쉼표 ( ','
) 로 구분하여 지정합니다 . 예 :
Name string `json:"name,omitempty" xml:"name"`
일반적으로 프로세스에서 필드를 제외 '-'
하는 "value"
수단에 대한 대시 값 ( ) (예 : json
해당 필드를 마샬링하거나 마샬링하지 않는 경우 ).
리플렉션을 사용하여 사용자 정의 태그에 액세스하는 예
리플렉션 ( reflect
package)을 사용하여 구조체 필드의 태그 값에 액세스 할 수 있습니다. 기본적으로 우리는 취득해야 Type
우리의 구조체를, 그리고 우리가 함께 예를 들어 필드를 조회 할 수 있습니다 Type.Field(i int)
또는 Type.FieldByName(name string)
. 이 메소드 StructField
는 구조체 필드를 설명하고 나타내는 값을 리턴 합니다. 그리고 StructField.Tag
타입의 값 StructTag
/이 태그 값을 나타내는 설명한다.
이전에는 "컨벤션"에 대해 이야기했습니다 . 당신이 그것을 따르는 경우에, 당신은 사용할 수 있음이 협약 수단 StructTag.Get(key string)
태그의 값을 구문 분석하고 반환 방법 "value"
의 key
지정을. 규칙은 이에 내장 / 구현 Get()
방법. 컨벤션을 따르지 Get()
않으면 key:"value"
쌍 을 구문 분석 하고 원하는 것을 찾을 수 없습니다 . 그것은 또한 문제가 아니지만, 자신 만의 파싱 로직을 구현해야합니다.
또한 "StructTag.Lookup()
Go 1.7에서 추가되었습니다 "Get()
는 " 빈 문자열을 주어진 키와 연관시키는 태그와 주어진 키를 포함하지 않는 태그를 구별하지만" 입니다.
간단한 예를 보자.
type User struct {
Name string `mytag:"MyName"`
Email string `mytag:"MyEmail"`
}
u := User{"Bob", "bob@mycompany.com"}
t := reflect.TypeOf(u)
for _, fieldName := range []string{"Name", "Email"} {
field, found := t.FieldByName(fieldName)
if !found {
continue
}
fmt.Printf("\nField: User.%s\n", fieldName)
fmt.Printf("\tWhole tag value : %q\n", field.Tag)
fmt.Printf("\tValue of 'mytag': %q\n", field.Tag.Get("mytag"))
}
출력 ( Go Playground 에서 시도 ) :
Field: User.Name
Whole tag value : "mytag:\"MyName\""
Value of 'mytag': "MyName"
Field: User.Email
Whole tag value : "mytag:\"MyEmail\""
Value of 'mytag': "MyEmail"
GopherCon 2015에는 다음과 같은 구조체 태그에 대한 프레젠테이션이있었습니다.
구조 태그의 여러 얼굴 (슬라이드) (및 비디오 )
일반적으로 사용되는 태그 키 목록은 다음과 같습니다.