Ich habe eine Struktur, die wie folgt aussieht:Implementierung Redigo Scanner-Schnittstelle auf ein Feld der Struktur
type authEnum int
const (
never authEnum = iota
sometimes
always
)
type Attrs struct {
Secret string `redis:"secret"`
RequireSecret authEnum `redis:"requireSecret"`
UserID string `redis:"userId"`
}
func (e *authEnum) RedisScan(src interface{}) error {
// This never gets called!
if e == nil {
return fmt.Errorf("nil pointer")
}
switch src := src.(type) {
case string:
if src == "false" || src == "never" {
*e = never
} else if src == "sometimes" {
*e = sometimes
} else { // "always" or "true"
*e = always
}
default:
return fmt.Errorf("cannot convert authEnum from %T to %T", src, e)
}
return nil
}
func getAttributes(ctx *AppContext, hash string) (*Attrs, error) {
rc := ctx.RedisPool.Get()
values, err := redis.Values(rc.Do("HGETALL", "redishash"))
rc.Close()
if err != nil {
return nil, err
}
attrs := Attrs{}
redis.ScanStruct(values, &attrs)
return &attrs, nil
}
Wie implementiere ich die Scanner Schnittstelle auf das RequireSecret
Attribute einen authEnum
Typen aus "never"
, "sometimes"
oder "always"
zu analysieren Redis Hashwerte?
Wie berechne ich den Wert und weise ihn dem authEnum zu? In meinem Codebeispiel wird nie RedisScan
aufgerufen.
Side Kommentar: Wenn Sie nicht brauchen, um Struktur Felder einzeln über die Redis-API zugreifen, dann ist es in der Regel besser zu kodieren Strukturen zu einem Redis Bulk-String mit Gob, Json, Yaml. –
Danke für die saubere RedisScan-Funktion! Dies wird jedoch immer noch nicht von ScanStruct aufgerufen. –
Das Programm unter https://play.golang.org/p/6fBVcGOupX funktioniert wie erwartet. Bestätigen Sie, dass die Antwort des Befehls das Feld enthält. –