Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk mengubah suai tag dalam golang

Bagaimana untuk mengubah suai tag dalam golang

PHPz
PHPzasal
2023-04-06 08:52:591197semak imbas

Tag dalam Golang boleh memberikan maklumat meta untuk medan struktur, yang boleh digunakan untuk penyiaran, penyahsirilan, pemetaan ORM dan senario lain. Dalam projek sebenar, apabila keperluan berubah, anda mungkin perlu menukar nilai kunci dalam teg Artikel ini akan memperkenalkan cara mengubah suai teg.

1. Ketidakbolehubahan

Teg dalam Golang tidak boleh diubah, kerana teg ditulis selepas jenis medan struktur dan merupakan sebahagian daripada definisi jenis Jika teg itu boleh ditukar sesuka hati , maka Takrif jenis ini juga akan berubah, yang akan memecahkan keselamatan jenis Go.

2. Penyelesaian

Memandangkan teg tidak boleh diubah, bagaimana untuk mengubah suai teg? Malah, ia boleh dicapai melalui refleksi.

Andaikan terdapat definisi struktur berikut:

type User struct {
    Id       int64     `json:"user_id" db:"id"`
    Username string    `json:"-" db:"username"`
    Password string    `json:"-" db:"password"`
}

Sekarang kita mahu menukar db dalam teg kepada db_new, yang boleh dicapai dengan kaedah berikut:

reflect.StructTag(`json:"user_id" db_new:"id"`).Get("db")

Kod reflect.StructTag() dalam adalah untuk menukar rentetan kepada jenis teg struktur, dan kaedah .Get() boleh mendapatkan nilai kunci yang ditentukan dalam teg struktur.

Mari kita lihat kod lengkap untuk mengubah suai teg:

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)
}

Dalam kod di atas, kita mula-mula mendapatkan teg medan struktur Id dan mengeluarkan nilai dbnya . Kemudian gunakan kaedah reflect.StructTag() untuk menukar rentetan json:"user_id" db_new:"id" kepada jenis tag struktur.

Seterusnya, kami menggunakan reflect.StructField{} untuk mencipta medan struktur baharu, menentukan nilai teg baharu dan beberapa atribut medan asal, seperti nama medan, jenis, sama ada tanpa nama, dsb. Kemudian gunakan reflect.StructOf() untuk mencipta jenis struct baharu.

Akhir sekali, kami menggunakan reflect.New() untuk mencipta contoh struktur baharu, menyalin nilai medan Id dalam contoh struktur asal kepada tika baharu dan menggunakan reflect.Type().Field(0).Tag.Get() untuk mendapatkan nilai db_new dalam contoh baharu contoh .

Jalankan kod dan output adalah seperti berikut:

id
db_new:"id"

3 Nota

Apabila mengubah suai teg dalam pembangunan sebenar, sila beri perhatian kepada perkara berikut: <.>

    Anda perlu membuat jenis struktur baru melalui refleksi, yang akan menanggung overhead prestasi tambahan berbanding secara langsung mengubah tag; . dibayar apabila mengubah suainya.
  • 4. Ringkasan
  • Di atas ialah kaedah dan langkah berjaga-jaga untuk mengubah suai teg di Golang. Secara umumnya, tidak disyorkan untuk mengubah suai teg melainkan benar-benar perlu. Dalam projek sebenar, anda boleh menambah teg baharu untuk memenuhi keperluan perubahan keperluan sambil mengekalkan invarian teg asal.

Atas ialah kandungan terperinci Bagaimana untuk mengubah suai tag dalam golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn