2017-10-23 11 views
0

redis.ScanStructを使用して文字列をブール値として、またはカスタムタイプとしても解析するにはどうすればよいですか?Redigoのブール値として "false"と "true"をスキャンする

構造体私はこのようなルックスを使用しています:

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

RequireSecret属性が「true」または「false」の文字列ですが、私はboolとして、それをスキャンしたいと思います。

+0

スキャンしようとしているタイプと、スキャンしている結果を生成するRedisコマンドを表示します。スキャナインターフェイスの実装は、解決しようとしている問題の最良の解決策ではないかもしれません。 –

+0

@CeriseLimón私は余分な情報で質問を補完します –

+0

スキャンしている結果を生成するRedisコマンドとは何ですか? –

答えて

2

次の型以下のコマンドを使用して

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

使用し、HGETALLの結果をスキャンする:RedigoはboolにRedisの結果値を変換するstrconv.ParseBoolを使用しているので、そうしない

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 
} 

"true""false"truefalseに変換するスキャナインターフェイスを実装する必要があります。

構造体のフィールドのサブセットにスキャナインターフェイスを実装できます。 Redigoは、インターフェイスを実装しているフィールドと、インターフェイスを実装するフィールドのアプリケーションのカスタムパーサーにデフォルトの解析を使用します。

Redis APIを使用して個々のハッシュ要素にアクセスする必要がある場合を除き、JSON、gobまたは他のエンコーダを使用して構造体をシリアル化することにより、Redis文字列として構造体を格納する方が良いでしょう。

+0

良いですね!しかし、もし私が何かを好きにしたいのなら、例えばEnumとしてRequireSecretを解析する(私は将来的に "true"と "false"よりも多くの値をサポートする予定です) –

+0

スキャナインタフェースを実装するRequireSecretフィールドにタイプを使用してくださいあなたが必要とするロジックで –

+0

私はフィールドにインターフェイスを実装するはずだったのか分かりませんでした。私はそれを試してみる:)。 –

関連する問題