Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk mengulangi medan rentetan dalam struct menggunakan refleksi dalam Go?

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

Patricia Arquette
Patricia Arquetteasal
2024-11-01 07:21:02559semak imbas

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>

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!

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