     (dotimes (i (min (Go--slice-len dst)
                      (Go--slice-len src)))
       (Go--slice-set dst i (Go--slice-get src i)))))
+
+(defun Go--subslice2 (slice low high)
+  (Go--slice-len-bound slice low)
+  (Go--slice-cap-bound slice high)
+  (Go--slice (Go--slice-data slice)
+             (+ (Go--slice-offset slice) low)
+             (- high low)
+             (- (Go--slice-cap slice) low)))
+
+;; Specialization for "slice[low:]".
+(defun Go--subslice-low (slice low)
+  (Go--slice-len-bound slice low)
+  (Go--slice (Go--slice-data slice)
+             (+ (Go--slice-offset slice) low)
+             (- (Go--slice-len slice) low)
+             (- (Go--slice-cap slice) low)))
+
+;; Specialization for "slice[:high]"
+(defun Go--subslice-high (slice high)
+  (Go--slice-cap-bound slice high)
+  (Go--slice (Go--slice-data slice)
+             (Go--slice-offset slice)
+             high
+             (Go--slice-cap slice)))

  `(aset (Go--slice-data ,slice)
         (+ ,index (Go--slice-offset ,slice))
         ,val))

;; Slices without offset are consedered `fast'.
;; In practice, lack of offset means that we can use

        ;; then re-set slice data with `vconcat' of old and new data.
        (let ((new-data (make-vector 16 nil)))
          (aset new-data 0 val)
          ;; For slices with offset with should take sub-vector
          ;; to avoid memory leaks.
          (Go--slice-data! slice
            (vconcat (if (Go--slice-fast? slice)
                         (Go--slice-data slice)
                       (substring (Go--slice-data slice)
                                  (Go--slice-offset slice)))
                     new-data))
          (Go--slice-cap! slice
                  (+ (Go--slice-cap slice)
                     (length new-data)))
          (unless (Go--slice-fast? slice)
            (Go--slice-offset! slice 0)))
      ;; Insert new value directly.
      (Go--slice-set slice pos val))
    slice))
