es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Acceder a DTO y Struct utilizando una variable de tipo string en Go.

Estoy tratando de establecer algunas marcas de tiempo basadas en los valores de una estructura y el dto en Go. Creo que aquí podría necesitar usar reflexión, pero soy principiante en Go y no estoy seguro de cómo abordar esto. Aquí tienes un vistazo a mi código existente. Tengo aproximadamente 300 configuraciones a las que me gustaría agregar una marca de tiempo, así que estoy tratando de optimizar mi código creando una función que tome el dto y la configuración y procese una marca de tiempo si corresponde. Específicamente, tengo problemas para averiguar cómo pasar el dto a la función processTimestamp a continuación, y también no estoy seguro de cómo referenciar el literal de cadena como nombre clave tanto para el dto como para la estructura.

dto.go

type Config struct {
    ConfigA             *bool       `json:"config_a,omitempty"`
    ConfigATimestamp    *int64      `json:"config_a_ts,omitempty"`
    ConfigB             *string     `json:"config_b,omitempty"`
    ConfigATimestamp    *int64      `json:"config_b_ts,omitempty"`
}

configmodel.go

type ConfigModel struct {
    ConfigA            *bool       `sql:"config_a" export:"config_a,omitempty"`
    ConfigATimestamp   *int64      `sql:"config_a_ts" export:"config_b,omitempty"`
    ConfigB            *string     `sql:"config_b" export:"config_c,omitempty"`
    ConfigBTimestamp   *int64      `sql:"config_b_ts" export:"config_b,omitempty"`
}

api.go (Ver processTimestamp: Esta es la función que estoy intentando implementar)

func update(handler http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

        ctx := r.Context()
        config := ctx.Value(key.Name("config")).(model.ConfigModel)
        dto := ctx.Value(key.Name("dto")).(*Config)

        processTimestamp(ctx, dto, "ConfigA") //intentando pasar ctx, dto y nombres de configuración
    })
}

func processTimestamp(ctx context.Context, dto *config, configName string) {
    now := time.Now().Unix()
    timestamp := configName + "Timestamp"
    if dto.(configName) == nil { 
        config.(configName) = nil
        config.(timestamp) = nil
    }
    config.(configName) = dto.(configName)
    config.(timestamp) = &now
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para establecer marcas de tiempo basadas en valores en una estructura y el dto en Go, puedes usar la reflexión para acceder a los campos de la estructura y establecer la marca de tiempo si corresponde. Aquí están los pasos para implementar esto:

    1. Define una función que tome el dto y el nombre de configuración como argumentos:
    func processTimestamp(dto *Config, configName string) {
        // TODO: implementar lógica de marca de tiempo
    }
    
    1. Usa la reflexión para acceder a los campos de la estructura y establecer la marca de tiempo si el campo no es nulo:
    func processTimestamp(dto *Config, configName string) {
        ahora := time.Now().Unix()
        nombreMarcaTiempo := configName + "Timestamp"
    
        // Obtén el valor del campo de configuración usando reflexión
        valorConfig := reflect.ValueOf(dto).Elem().FieldByName(configName)
    
        // Obtén el valor del campo de marca de tiempo usando reflexión
        valorMarcaTiempo := reflect.ValueOf(dto).Elem().FieldByName(nombreMarcaTiempo)
    
        // Si el campo de configuración no es nulo, establece el valor de marca de tiempo como el tiempo actual
        if !valorConfig.IsNil() {
            valorMarcaTiempo.SetInt(ahora)
        }
    }
    
    1. Llama a la función processTimestamp en tu función update con los argumentos necesarios:
    func update(handler http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            ctx := r.Context()
            config := ctx.Value(key.Name("config")).(model.ConfigModel)
            dto := ctx.Value(key.Name("dto")).(*Config)
    
            processTimestamp(dto, "ConfigA")
        })
    }
    

    Ten en cuenta que en la función processTimestamp, estamos verificando si el campo de configuración es nulo usando valorConfig.IsNil(), y estableciendo el valor de la marca de tiempo como el tiempo actual usando valorMarcaTiempo.SetInt(ahora). Suponiendo que hayas definido correctamente las estructuras Config y ConfigModel, esta implementación debería funcionar para establecer marcas de tiempo basadas en valores en la estructura y el dto en Go.

Comments are closed.