【问题标题】:golang leveldb get snapshot errorgolang leveldb获取快照错误
【发布时间】:2017-07-25 21:34:21
【问题描述】:

我得到了 leveldb 的所有 key-val 到 map[string][]byte,但它没有按我的预期运行。 代码如下

package main
import (
    "fmt"
    "strconv"
    "github.com/syndtr/goleveldb/leveldb"
)
func main() {
    db, err := leveldb.OpenFile("db", nil)
    if err != nil {
        panic(err)
    }
    defer db.Close()
    for i := 0; i < 10; i++ {
        err := db.Put([]byte("key"+strconv.Itoa(i)), []byte("value"+strconv.Itoa(i)), nil)
        if err != nil {
            panic(err)
        }
    }
    snap, err := db.GetSnapshot()
    if err != nil {
        panic(err)
    }
    if snap == nil {
        panic("snap shot is nil")
    }
    data := make(map[string][]byte)
    iter := snap.NewIterator(nil, nil)
    for iter.Next() {
        Key := iter.Key()
        Value := iter.Value()
        data[string(Key)] = Value
    }
    iter.Release()
    if iter.Error() != nil {
        panic(iter.Error())
    }
    for k, v := range data {
        fmt.Println(string(k) + ":" + string(v))
    }
}

但结果如下 键3:值9 键6:值9 键7:值9 键8:值9 键1:值9 键2:值9 键4:值9 键5:值9 键9:值9 键0:值9 而不是 key0:value0

【问题讨论】:

    标签: go leveldb


    【解决方案1】:

    问题在于类型转换(byte[]string 等)。

    您正在尝试打印string 值。为避免不必要的强制转换,请应用以下修改:

    • data初始化更改为data := make(map[string]string)
    • 使用 `data[string(Key)] = string(Value) 将值分配给 data(顺便说一下,不要对不打算导出的变量使用大写)
    • fmt.Println(k + ":" + v)) 打印data 的值

    这应该会产生以下结果:

    key0:value0
    key1:value1
    key7:value7
    key2:value2
    key3:value3
    key4:value4
    key5:value5
    key6:value6
    key8:value8
    key9:value9
    

    【讨论】:

    • 非常感谢您的回答,它有效。但是为什么值会改变?有点困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    • 2013-03-27
    • 1970-01-01
    • 2012-08-11
    • 2018-09-26
    相关资源
    最近更新 更多