Golang의 태그는 직렬화, 역직렬화, ORM 매핑 및 기타 시나리오에 사용할 수 있는 구조 필드에 대한 메타 정보를 제공할 수 있습니다. 실제 프로젝트에서는 요구사항이 변경되면 태그의 키 값을 변경해야 할 수도 있습니다. 이 글에서는 태그를 수정하는 방법을 소개합니다.
태그는 구조 필드의 유형 다음에 작성되고 유형 정의의 일부이기 때문에 Golang의 태그는 불변입니다. 태그를 마음대로 변경할 수 있으면 이 유형의 정의가 변경됩니다. 또한 변경하면 Go의 유형 안전성이 손상됩니다.
태그는 불변인데 어떻게 수정하나요? 실제로 그것은 성찰을 통해 달성될 수 있다.
다음과 같은 구조 정의가 있다고 가정합니다.
type User struct { Id int64 `json:"user_id" db:"id"` Username string `json:"-" db:"username"` Password string `json:"-" db:"password"` }
이제 태그의 db를 db_new로 변경하려고 합니다. 이는 다음 방법으로 달성할 수 있습니다.
reflect.StructTag(`json:"user_id" db_new:"id"`).Get("db")
reflect.StructTag()
코드에서 문자열은 구조 태그 유형으로 변환되고 .Get()
메서드는 구조 태그에 지정된 키 값을 얻을 수 있습니다. reflect.StructTag()
是将字符串转换为结构体 tag 类型,.Get()
方法可以获取结构体 tag 中指定键的值。
下面看一下完整的修改 tag 的代码:
package main import ( "fmt" "reflect" ) func main() { type User struct { Id int64 `json:"user_id" db:"id"` Username string `json:"-" db:"username"` Password string `json:"-" db:"password"` } user := User{Id: 1, Username: "foo", Password: "bar"} field := reflect.TypeOf(user).Field(0) tag := field.Tag fmt.Println(tag.Get("db")) newTag := reflect.StructTag(`json:"user_id" db_new:"id"`) newField := reflect.StructField{ Name: field.Name, Type: field.Type, Tag: newTag, Anonymous: field.Anonymous, } newType := reflect.StructOf([]reflect.StructField{newField}) newUser := reflect.New(newType).Elem() newUser.Field(0).SetInt(user.Id) newTagValue := newUser.Type().Field(0).Tag.Get("db_new") fmt.Println(newTagValue) }
以上代码中,我们首先获取了结构体字段 Id
的 tag,输出它的 db 值。然后使用 reflect.StructTag()
方法将字符串 json:"user_id" db_new:"id"
转换为结构体 tag 类型。
接着,我们使用 reflect.StructField{}
创建新的结构体字段,指定新的 tag 值,以及原始字段的一些属性,比如字段名、类型、是否匿名等。然后使用 reflect.StructOf()
创建一个新的结构体类型。
最后,我们使用 reflect.New()
创建一个新的结构体实例,将原来结构体实例中的 Id 字段的值复制到新的实例中,使用 reflect.Type().Field(0).Tag.Get()
id db_new:"id"위 코드에서는 먼저 구조 필드
Id
의 태그를 얻고 해당 db 값을 출력합니다. 그런 다음 reflect.StructTag()
메서드를 사용하여 json:"user_id" db_new:"id"
문자열을 구조 태그 유형으로 변환합니다. 다음으로 reflect.StructField{}
를 사용하여 새 구조 필드를 생성하고, 새 태그 값과 필드 이름, 유형, 익명 여부 등 원래 필드의 일부 속성을 지정합니다. , 등. 그런 다음 reflect.StructOf()
를 사용하여 새 구조 유형을 만듭니다. 마지막으로 reflect.New()
를 사용하여 새 구조 인스턴스를 생성하고 원래 구조 인스턴스의 Id 필드 값을 새 인스턴스에 복사한 다음 reflect Type을 사용합니다. ().Field(0).Tag.Get()
새 인스턴스에서 db_new 값을 가져옵니다. 태그 값을 수정한 후에는 원래 ORM 매핑이 영향을 받을 수 있으므로 태그 값을 수정해도 다른 기능이 오작동하지 않는지 확인해야 합니다. key:value 형식으로 지정해야 합니다. 여러 키 값을 수정할 때는 특별한 주의가 필요합니다.
🎜🎜4. 요약🎜🎜이상은 Golang에서 태그를 수정하는 방법과 주의사항입니다. 일반적으로 꼭 필요한 경우가 아니면 태그를 수정하지 않는 것이 좋습니다. 실제 프로젝트에서는 원본 태그의 불변성을 유지하면서 변화하는 요구 사항을 충족하기 위해 새 태그를 추가할 수 있습니다. 🎜위 내용은 golang에서 태그를 수정하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!