code: func (snap *Snapshot) NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator {
  	if err := snap.db.ok(); err != nil {
  		return iterator.NewEmptyIterator(err)
  	}
  	snap.mu.Lock()
  	defer snap.mu.Unlock()
  	if snap.released {
  		return iterator.NewEmptyIterator(ErrSnapshotReleased)
  	}
  	// Since iterator already hold version ref, it doesn't need to
  	// hold snapshot ref.
  	return snap.db.newIterator(nil, nil, snap.elem.seq, slice, ro)
  }
docs: // NewIterator returns an iterator for the snapshot of the underlying DB.
  // The returned iterator is not safe for concurrent use, but it is safe to use
  // multiple iterators concurrently, with each in a dedicated goroutine.
  // It is also safe to use an iterator concurrently with modifying its
  // underlying DB. The resultant key/value pairs are guaranteed to be
  // consistent.
  //
  // Slice allows slicing the iterator to only contains keys in the given
  // range. A nil Range.Start is treated as a key before all keys in the
  // DB. And a nil Range.Limit is treated as a key after all keys in
  // the DB.
  //
  // WARNING: Any slice returned by interator (e.g. slice returned by calling
  // Iterator.Key() or Iterator.Value() methods), its content should not be
  // modified unless noted otherwise.
  //
  // The iterator must be released after use, by calling Release method.
  // Releasing the snapshot doesn't mean releasing the iterator too, the
  // iterator would be still valid until released.
  //
  // Also read Iterator documentation of the leveldb/iterator package.