code: func growSlice(v reflect.Value, maxCapacity int, sizes ...int) {
  	cap := v.Cap()
  	max := cap
  	for _, size := range sizes {
  		if size > max {
  			max = size
  		}
  	}
  	if len(sizes) == 0 || max > maxCapacity {
  		max = maxCapacity
  	}
  	if max <= cap {
  		return
  	}
  	if v.Len() > 0 {
  		extra := reflect.MakeSlice(v.Type(), 0, max)
  		reflect.Copy(extra, v)
  		v.Set(extra)
  	} else {
  		extra := reflect.MakeSlice(v.Type(), 0, max)
  		v.Set(extra)
  	}
  }
docs: // growSlice takes a slice value and grows its capacity up
  // to the maximum of the passed sizes or maxCapacity, whichever
  // is smaller. Above maxCapacity decisions about allocation are left
  // to the Go runtime on append. This allows a caller to make an
  // educated guess about the potential size of the total list while
  // still avoiding overly aggressive initial allocation. If sizes
  // is empty maxCapacity will be used as the size to grow.