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.
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.
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"
Apabila mengubah suai teg dalam pembangunan sebenar, sila beri perhatian kepada perkara berikut: <.>
Atas ialah kandungan terperinci Bagaimana untuk mengubah suai tag dalam golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!