我被下面的代码片段中类型断言相关的错误所困扰。我不知道我错过了什么。 (* DbIterator).Iterator和key:= itr.Key()。(* Key).Slice和value:= itr.Value()。(* Value)。片。我想知道是否有更好的方法来做到这一点,而无需在代码库中随处输入断言,或者更好的设计模式来处理这种情况。代码片段是更大代码库的一部分。我已经为这个问题拉出了最相关的位。任何在这方面的帮助,非常感谢。Golang:类型断言错误问题

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 
} 

我有一个迭代符接口

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 

2016-09-22 Nik