簡體   English   中英

Golang:類型聲明錯誤問題

[英]Golang: Type Assertion Error issue

我在下面的代碼片段中被類型聲明相關的錯誤所困擾。 我不確定我缺少什么。 我在以下位置進行類型斷言itr = itr。(* DbIterator).Iterator和key:= itr.Key()。(* Key).Slice和value:= itr.Value()。(* Value)。切片。 我想知道是否有更好的方法來執行此操作,而無需在代碼庫中的任何地方使用類型聲明,也可以使用更好的設計模式來處理這種情況。 該代碼段是較大代碼庫的一部分。 我已經把這個問題最相關的部分。 非常感謝這方面的任何幫助。

package rocksdb

import (
    "github.com/tecbot/gorocksdb"
)

func (s *RocksDB) GetCFIterator(cfHandler *gorocksdb.ColumnFamilyHandle) db.Iterator {
    opt := gorocksdb.NewDefaultReadOptions()
    opt.SetFillCache(true)
    defer opt.Destroy()
    return &DbIterator{s.DB.NewIteratorCF(opt, cfHandler)}
}

type DbIterator struct {
    *gorocksdb.Iterator
}

type Key struct {
    *gorocksdb.Slice
}

type Value struct {
    *gorocksdb.Slice
}

func (iterator *DbIterator) Key() db.Keyer {
    return &Key{iterator.Iterator.Key()}
}

func (iterator *DbIterator) Value() db.Valuer {
    return &Value{iterator.Iterator.Value()}
}

type RocksDB struct {
    DB *gorocksdb.DB
}

我有一個Interator界面

package db

import (
    "bytes"
    "testing"
)

type Iterator interface {
    Valid() bool
    Next()
    Close()
    SeekToFirst()
    SeekToLast()
    Seek(key []byte)
    Key() Keyer
    Value() Valuer
}

type Keyer interface {
}

type Valuer interface {
}

func testIterator(t *testing.T, itr db.Iterator, expectedValues map[string][]byte) {
    itrResults := make(map[string][]byte)
    itr = itr.(*DbIterator).Iterator //Line 270 which the error throws
    itr.SeekToFirst()
    for ; itr.Valid(); itr.Next() {
        key := itr.Key().(*Key).Slice
        value := itr.Value().(*Value).Slice
        k := makeCopy(key.Data())
        v := makeCopy(value.Data())
        itrResults[string(k)] = v
    }
    if len(itrResults) != len(expectedValues) {
        t.Fatalf("Expected [%d] results from iterator, found [%d]", len(expectedValues), len(itrResults))
    }
    for k, v := range expectedValues {
        if !bytes.Equal(itrResults[k], v) {
            t.Fatalf("Wrong value for key [%s]. Expected [%s], found [%s]", k, itrResults[k], v)
        }
    }
}

錯誤信息

github.com/hyperledger/fabric/core/db/rocksdb
core/db/rocksdb/rocksdb_test.go:270: cannot use itr.(*DbIterator).Iterator (type *gorocksdb.Iterator) as type db.Iterator in assignment:
*gorocksdb.Iterator does not implement db.Iterator (wrong type for Key method)
have Key() *gorocksdb.Slice
want Key() db.Keyer

問題不在於類型是否斷言,而是因為要使用的實例未實現該接口,所以您將在這里中斷。 話雖如此,您可以通過執行此操作優雅地處理此問題;

 itr, ok = itr.(*DbIterator)
 if !ok {
     //try to recover
 }

但是,是的,就像我說的那樣,當您到達該代碼時, itr的類型不是代碼所期望的,因此它不會以期望的結果結尾,您必須在此處進行一些恢復/錯誤處理才能使其正常工作最好還是先弄清楚您是如何傳遞錯誤的類型的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM