Go 如何读取*redis.Client.TxPipeline.Exec()方法';s在映射[string]字符串中的响应

Go 如何读取*redis.Client.TxPipeline.Exec()方法';s在映射[string]字符串中的响应,go,redis,Go,Redis,我正在使用redis.v5。我想一次性读取所有redis键的值,每个键的值都是hashMap,即map[string]string。因此,我正在使用MULTI/EXEC的Redis事务功能。我有一个函数可以这样做,我得到的响应如下: [hgetall x: map[VIN:POIUYTRUT4567ASWQ beaconID:1123VBG132 customerName:Amit displayLocation:waiting launge timestamp:2017-12-26T08:51

我正在使用redis.v5。我想一次性读取所有redis键的值,每个键的值都是hashMap,即map[string]string。因此,我正在使用MULTI/EXEC的Redis事务功能。我有一个函数可以这样做,我得到的响应如下:

[hgetall x: map[VIN:POIUYTRUT4567ASWQ beaconID:1123VBG132 customerName:Amit displayLocation:waiting launge timestamp:2017-12-26T08:51:21.509Z] y: map[VIN:POIUYTRUT4567qweD beaconID:1123VBG13222 customerName:prameet displayLocation:waiting launge timestamp:2017-12-26T08:51:21.509Z]]
cmdMap := map[string]string
cmder, err := pipe.Exec()
if err != nil {
    return nil, err
}
for cmd := range cmder {
    key := cmd.Name() // maybe use cmd.Args() to distinguish
    cmdMap[key] = cmd.String()
}
return cmdMap, nil
我的职能是:

 func GetListOfValuesForKeys( keys []string,address, password string,db int) ([]map[string]string, error) {
    redisClient, err := redis.NewClient(loadRedisOptions(address, password, db))
    if err != nil {
        return nil, err
    }
    pipe := redisClient.TxPipeline()
    for _, val := range keys {
        pipe.HGetAll(val)
    }
    var data []map[string]string

    cmder, err := pipe.Exec()
    if err != nil {
        return nil, err
    }
    fmt.Printf("\n|**********res %++v**************|\n", cmder)

    return data, nil
}

func loadRedisOptions(address, password string, db int) *redis.Options 
{

return &redis.Options{
    Addr:     address,
    Password: password,
    DB:       db,
}
}
现在redis.v5中有任何内置方法可以将pipe.Exec()方法的响应解组为map[string]string。方法返回以下给定接口([]Cmder)的一部分:


这是Exec的定义:

func(c*管道)Exec()([]Cmder,错误)

Cmder
实现

type Cmder interface {
    Name() string
    Args() []interface{}

    Err() error
    fmt.Stringer
    // contains filtered or unexported methods
}

Cmder
实现定义为

type Stringer interface {
    String() string
}
在哪里

Stringer由任何具有String方法的值实现,该方法 定义该值的“本机”格式。使用字符串方法 将作为操作数传递的值打印为接受 字符串或到未格式化的打印机,如打印

因此,

您可以通过执行以下操作来访问值:

Cmder.String()

所以你要找的是这样的东西:

[hgetall x: map[VIN:POIUYTRUT4567ASWQ beaconID:1123VBG132 customerName:Amit displayLocation:waiting launge timestamp:2017-12-26T08:51:21.509Z] y: map[VIN:POIUYTRUT4567qweD beaconID:1123VBG13222 customerName:prameet displayLocation:waiting launge timestamp:2017-12-26T08:51:21.509Z]]
cmdMap := map[string]string
cmder, err := pipe.Exec()
if err != nil {
    return nil, err
}
for cmd := range cmder {
    key := cmd.Name() // maybe use cmd.Args() to distinguish
    cmdMap[key] = cmd.String()
}
return cmdMap, nil

如果这不起作用,请告诉我。

因为我在问题中共享了cmder界面,所以它不会导出名称和参数。因此,我不能在我的应用程序中使用cmd.Name()或cmd.Args()。当您执行
cmd.Name()
cmd.Args()
时,您会得到什么输出?我无法访问Name和Args方法,因为在redis.v5中,它们没有导出。请查看上面提到的cmder接口结构。我还更新了GetListOfValuesForKeys()函数返回类型,当我在redis中为每个键值设置数据时,它实际上返回[]map[string]string(映射[string]string)。@negiYogi mate,
接口
是一个行为契约,根据您发布的接口,它有
Name()
Args()
,并且根据定义,实现该接口的所有结构都必须具有这些函数