0603: 代码重构

如果把 SSTable 增加到 KV 里,查询时要同时查询内存数据结构(MemTable)和 SSTable,合并结果。现在的内存数据结构只是2个数组:

type KV struct {
    log  Log
    keys [][]byte
    vals [][]byte
}

这一步不增加功能,而是把内存数据结构挪到单独的模块里,为下一步的合并操作做准备。也方便以后替换数据结构。

type KV struct {
    log Log
    mem SortedArray
}
type SortedArray struct {
    keys [][]byte
    vals [][]byte
}

抽离出的 SortedArray 满足 SortedKV interface,可作为 SSTable 的输入:

func (arr *SortedArray) Size() int { return len(arr.keys) }
func (arr *SortedArray) Iter() (SortedKVIter, error) {
    return &SortedArrayIter{arr.keys, arr.vals, 0}, nil
}

KVIterator 换个更合适的名字:SortedArrayIterKV.Seek() 改成返回 interface:

func (kv *KV) Seek(key []byte) (SortedKVIter, error)

结构体不要直接操作,而是通过方法函数。原来的 get、set、del 也挪过去:

func (arr *SortedArray) Key(i int) []byte { return arr.keys[i] }
func (arr *SortedArray) Clear()
func (arr *SortedArray) Push(key []byte, val []byte)
func (arr *SortedArray) Pop()
func (arr *SortedArray) Get(key []byte) (val []byte, ok bool, err error)
func (arr *SortedArray) Set(key []byte, val []byte) (updated bool, err error)
func (arr *SortedArray) Del(key []byte) (deleted bool, err error)

您正在阅读免费版教程,从第4章起只有简单的指引,适合爱好挑战和自学的读者。
可以购买有详细指导+背景知识的完整版