code: func (s *tikvSnapshot) BatchGet(keys []kv.Key) (map[string][]byte, error) {
  	m := make(map[string][]byte)
  	if len(keys) == 0 {
  		return m, nil
  	}
  	tikvTxnCmdCounterWithBatchGet.Inc()
  	start := time.Now()
  	defer func() { tikvTxnCmdHistogramWithBatchGet.Observe(time.Since(start).Seconds()) }()
  
  	// We want [][]byte instead of []kv.Key, use some magic to save memory.
  	bytesKeys := *(*[][]byte)(unsafe.Pointer(&keys))
  	ctx := context.WithValue(context.Background(), txnStartKey, s.version.Ver)
  	bo := NewBackoffer(ctx, batchGetMaxBackoff).WithVars(s.vars)
  
  	// Create a map to collect key-values from region servers.
  	var mu sync.Mutex
  	err := s.batchGetKeysByRegions(bo, bytesKeys, func(k, v []byte) {
  		if len(v) == 0 {
  			return
  		}
  		mu.Lock()
  		m[string(k)] = v
  		mu.Unlock()
  	})
  	if err != nil {
  		return nil, errors.Trace(err)
  	}
  
  	err = s.store.CheckVisibility(s.version.Ver)
  	if err != nil {
  		return nil, errors.Trace(err)
  	}
  
  	return m, nil
  }
docs: // BatchGet gets all the keys' value from kv-server and returns a map contains key/value pairs.
  // The map will not contain nonexistent keys.