>  기사  >  백엔드 개발  >  golang에서 태그를 수정하는 방법

golang에서 태그를 수정하는 방법

PHPz
PHPz원래의
2023-04-06 08:52:591176검색

Golang의 태그는 직렬화, 역직렬화, ORM 매핑 및 기타 시나리오에 사용할 수 있는 구조 필드에 대한 메타 정보를 제공할 수 있습니다. 실제 프로젝트에서는 요구사항이 변경되면 태그의 키 값을 변경해야 할 수도 있습니다. 이 글에서는 태그를 수정하는 방법을 소개합니다.

1. 불변성

태그는 구조 필드의 유형 다음에 작성되고 유형 정의의 일부이기 때문에 Golang의 태그는 불변입니다. 태그를 마음대로 변경할 수 있으면 이 유형의 정의가 변경됩니다. 또한 변경하면 Go의 유형 안전성이 손상됩니다.

2. Solution

태그는 불변인데 어떻게 수정하나요? 실제로 그것은 성찰을 통해 달성될 수 있다.

다음과 같은 구조 정의가 있다고 가정합니다.

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 값을 가져옵니다.
  • 코드를 실행하면 다음과 같이 출력됩니다.
  • rrreee
  • 3.Notes
  • 실제 개발 시 태그 수정 시 주의할 점은 다음과 같습니다.

Reflection을 통해 새로운 구조체 타입을 생성해야 합니다. 태그를 직접 수정하면 추가 성능 오버헤드가 발생합니다.

태그 값을 수정한 후에는 원래 ORM 매핑이 영향을 받을 수 있으므로 태그 값을 수정해도 다른 기능이 오작동하지 않는지 확인해야 합니다. key:value 형식으로 지정해야 합니다. 여러 키 값을 수정할 때는 특별한 주의가 필요합니다.

🎜🎜4. 요약🎜🎜이상은 Golang에서 태그를 수정하는 방법과 주의사항입니다. 일반적으로 꼭 필요한 경우가 아니면 태그를 수정하지 않는 것이 좋습니다. 실제 프로젝트에서는 원본 태그의 불변성을 유지하면서 변화하는 요구 사항을 충족하기 위해 새 태그를 추가할 수 있습니다. 🎜

위 내용은 golang에서 태그를 수정하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.