Bagaimana untuk mengubah suai tag dalam golang

PHPz
Lepaskan: 2023-04-06 09:40:42
asal
1178 orang telah melayarinya

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"`
}
Salin selepas log masuk

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")
Salin selepas log masuk

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)
}
Salin selepas log masuk

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"
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan