使用 redigo 的时候,一开始总是在疑惑如何判断没有获取到值得情况。
实际它的判断比较简单,一种情况是直接调用 Do
的情况,此时没有获取到值不会返回 err,而是 reply 为 nil:
rep, err = conn.Do("GET", "key")
if err != nil {
log.Fatal(err)
}
fmt.Println(rep)
相当于与redis命令执行一样的。
另一种是通过库里提供的方法进行转换,此时会返回错误,比如转为 string :
rep, err = redis.String(conn.Do("GET", "key"))
if err != nil {
log.Fatal(err)
}
fmt.Println(rep)
redis.String 实现:
// String is a helper that converts a command reply to a string. If err is not
// equal to nil, then String returns "", err. Otherwise String converts the
// reply to a string as follows:
//
// Reply type Result
// bulk string string(reply), nil
// simple string reply, nil
// nil "", ErrNil
// other "", error
func String(reply interface{}, err error) (string, error) {
if err != nil {
return "", err
}
switch reply := reply.(type) {
case []byte:
return string(reply), nil
case string:
return reply, nil
case nil:
return "", ErrNil
case Error:
return "", reply
}
return "", fmt.Errorf("redigo: unexpected type for String, got type %T", reply)
}
此时如果返回nil结果,转换后会报错,返回 redis.ErrNil 错误。