2017-10-23 1 views
0

Wie kann ich redis.ScanStruct verwenden, um Strings als Boolean oder sogar als benutzerdefinierte Typen zu analysieren?Scannen "False" und "True" als Booleans in Redigo

Die Struktur Ich benutze sieht wie folgt aus:

type Attrs struct { 
    Secret   string `redis:"secret"` 
    RequireSecret string `redis:"requireSecret"` 
    UserID   string `redis:"userId"` 
} 

Das RequireSecret Attribut ist entweder ein „true“ oder „false“ string, würde Ich mag es scannen als bool.

+0

Zeigen Sie die zu scannenden Dateitypen und den Redis-Befehl an, der das Ergebnis erzeugt, das Sie gerade scannen. Die Implementierung der Scannerschnittstelle ist möglicherweise nicht die beste Lösung für das Problem, das Sie zu lösen versuchen. –

+0

@ CeriseLimón Ich ergänze meine Frage mit zusätzlichen Informationen –

+0

Was ist der Redis-Befehl, der das Ergebnis erzeugt, das Sie scannen? –

Antwort

2

das Ergebnis HGETALL zu scannen, verwenden Sie die folgende Art

type Attrs struct { 
    Secret   string `redis:"secret"` 
    RequireSecret bool `redis:"requireSecret"` 
    UserID   string `redis:"userId"` 
} 

mit dem folgenden Befehl:

values, err := redis.Values(c.Do("HGETALL", key)) 
if err != nil { 
    // handle error 
} 
var attrs Attrs 
err = redis.ScanStruct(values, &attrs) 
if err != nil { 
    // handle error 
} 

Da Redigo strconv.ParseBool verwendet Redis Ergebniswerte zu bool, die Sie nicht konvertieren müssen die Scannerschnittstelle implementieren, um "true" und "false" zu true und false zu konvertieren.

Sie können die Scannerschnittstelle für eine Teilmenge der Felder einer Struktur implementieren. Redigo verwendet das Standardparsing für Felder, die die Schnittstelle nicht implementieren, und den benutzerdefinierten Parser der Anwendung für die Felder, die die Schnittstelle implementieren.

Sofern Sie nicht über die Redis-API auf einzelne Hash-Elemente zugreifen müssen, ist es normalerweise besser, sructs als Redis-Zeichenfolge zu speichern, indem Sie die Struktur mit JSON, Gob oder einem anderen Encoder serialisieren.

+0

Klingt gut! Aber was, wenn ich etwas Zarteres haben möchte, zum Beispiel RequireSecret als Enum zu analysieren (ich beabsichtige in Zukunft mehr Werte als "True" und "False" zu unterstützen) –

+0

Verwenden Sie einen Typ für das RequireSecret Feld, das die Scannerschnittstelle implementiert mit der Logik, die du brauchst. –

+0

Ich sehe, ich wusste nicht, dass ich die Schnittstelle auf einem Feld implementieren sollte. Ich werde es ausprobieren :). –