Bagaimana untuk mengulangi medan rentetan dalam struct menggunakan refleksi dalam Go?

Patricia Arquette
Lepaskan: 2024-11-01 07:21:02
asal
486 orang telah melayarinya

How to iterate over string fields in a struct using reflection in Go?

Merelakan Merentas Medan Rentetan dalam Struktur

Masalah:

Membalas pada medan rentetan sesuatu struct memberikan cabaran, terutamanya apabila ingin melakukan operasi pembersihan atau pengesahan. Melaksanakan ini dengan pendekatan suis kes tidak berskala dan tidak sesuai apabila memanfaatkan gorila/skema untuk unmarshalling.

Penyelesaian:

Reflect menyediakan jalan untuk lelaran atas struct medan dan memanipulasi medan rentetan dengan lancar. Begini cara ia boleh dicapai:

  1. Dapatkan Penunjuk kepada Struktur:
    Untuk mengubah suai nilai, penuding kepada struct diperlukan.
  2. Lelaran Atas Medan:
    Gunakan NumFields() untuk menentukan bilangan medan dan Medan() untuk lelaran pada setiap medan dalam struct.
  3. Semak Jenis Medan:
    Sahkan setiap jenis medan menggunakan Type(). Hanya medan rentetan memerlukan pengubahsuaian.
  4. Bersihkan Rentetan:
    Dapatkan semula nilai medan dengan Antara Muka() dan gunakan operasi pembersihan yang diingini daripada pakej rentetan (cth. TrimSpace).
  5. Nilai Kemas Kini:
    Gunakan SetString() untuk mengemas kini nilai medan rentetan.

Contoh:

<code class="go">package main

import (
    "fmt"
    "reflect"
    "strings"
)

type MyStruct struct {
    A, B, C string
    I int
    D string
    J int
}

func main() {
    ms := MyStruct{"Green ", "Eggs", " and ", 2, "Ham      ", 15}
    fmt.Printf("%s%s%s%d%s%d\n", ms.A, ms.B, ms.C, ms.I, ms.D, ms.J)

    msValuePtr := reflect.ValueOf(&ms)
    msValue := msValuePtr.Elem()

    for i := 0; i < msValue.NumField(); i++ {
        field := msValue.Field(i)
        if field.Type() != reflect.TypeOf("") {
            continue
        }
        str := field.Interface().(string)
        str = strings.TrimSpace(str)
        field.SetString(str)
    }
    fmt.Printf("%s%s%s%d%s%d\n", ms.A, ms.B, ms.C, ms.I, ms.D, ms.J)
}</code>
Salin selepas log masuk

Kaveat:

  • Pendekatan ini memerlukan penuding kepada struct.
  • Refleksi mungkin panik apabila cuba mengubah suai medan yang tidak dieksport. Tangani ini dengan melaksanakan kod dalam pakej.

Atas ialah kandungan terperinci Bagaimana untuk mengulangi medan rentetan dalam struct menggunakan refleksi dalam Go?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!