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
}
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:
processTimestamp
en tu funciónupdate
con los argumentos necesarios:Ten en cuenta que en la función
processTimestamp
, estamos verificando si el campo de configuración es nulo usandovalorConfig.IsNil()
, y estableciendo el valor de la marca de tiempo como el tiempo actual usandovalorMarcaTiempo.SetInt(ahora)
. Suponiendo que hayas definido correctamente las estructurasConfig
yConfigModel
, esta implementación debería funcionar para establecer marcas de tiempo basadas en valores en la estructura y el dto en Go.