使用 redigo 的时候,一开始总是在疑惑如何判断没有获取到值得情况。

实际它的判断比较简单,一种情况是直接调用 Do 的情况,此时没有获取到值不会返回 err,而是 reply 为 nil:

rep, err = conn.Do("GET", "key")
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(rep)
Go

相当于与redis命令执行一样的。

另一种是通过库里提供的方法进行转换,此时会返回错误,比如转为 string :

rep, err = redis.String(conn.Do("GET", "key"))
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(rep)
Go

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)
}
Go

此时如果返回nil结果,转换后会报错,返回 redis.ErrNil 错误。