Maison > développement back-end > Golang > Comment puis-je accéder à la structure sous-jacente de Reflect.Value ?

Comment puis-je accéder à la structure sous-jacente de Reflect.Value ?

PHPz
Libérer: 2024-02-11 09:21:08
avant
975 Les gens l'ont consulté

如何访问 Reflect.Value 的底层结构?

L'éditeur php Xigua vous présentera comment accéder à la structure sous-jacente de Reflect.Value. Reflect.Value est un type important dans le langage Go, utilisé pour représenter n'importe quelle valeur au moment de l'exécution. Bien qu'il fournisse de nombreuses méthodes pratiques pour manipuler les valeurs, nous pouvons parfois avoir besoin d'un accès de niveau inférieur pour obtenir plus d'informations. Pour accéder à la structure sous-jacente de Reflect.Value, nous pouvons utiliser la méthode Interface pour la convertir en un type d'interface vide, puis la convertir en un type de structure concrète via une assertion de type. De cette façon, nous pouvons accéder directement aux champs et méthodes de la structure sous-jacente.

Contenu de la question

Comment accéder à la structure sous-jacente (opaque) de Reflect.Value (par exemple, time.Time) à partir d'une bibliothèque de réflexion ?

Jusqu'à présent, j'ai créé un time.Time temporaire, j'ai obtenu sa ValueOf, puis j'ai utilisé Set() pour le copier. Existe-t-il un moyen d'accéder directement à l'original en heure. temps?

Solution

Quand tu as une représentation time.Time 类型值的 reflect.Value 时,您可以在 reflect.Value 上使用 Interface() 方法来获取 interface{} 形式的值,然后执行类型断言将其转换回 time.Time.

Voici comment inclure généralement time.Timereflect.Value 转换回 time.Time :

package main

import (
    "fmt"
    "reflect"
    "time"
)

type MyStruct struct {
    Timestamp time.Time
    Name      string
}

func main() {
    // Create a MyStruct value.
    s := MyStruct{
        Timestamp: time.Now(),
        Name:      "Test",
    }

    // Get the reflect.Value of the MyStruct value.
    val := reflect.ValueOf(s)

    // Access the Timestamp field.
    timeField := val.FieldByName("Timestamp")

    // Use Interface() to get an interface{} value, then do a type assertion
    // to get the underlying time.Time.
    underlyingTime, ok := timeField.Interface().(time.Time)
    if !ok {
        fmt.Println("Failed to get the underlying time.Time")
        return
    }

    fmt.Println("Underlying time.Time:", underlyingTime)
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal