Maison  >  Article  >  développement back-end  >  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
PHPzavant
2024-02-11 09:21:08827parcourir

如何访问 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)
}

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer