         ;; 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 (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))))
+                  (+ (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))

(defmacro Go--slice-len (slice)    `(car (cdr (cdr ,slice))))
(defmacro Go--slice-cap (slice)    `(cdr (cdr (cdr ,slice))))

;; Setters (note that slice offset is conceptually immutable).
(defmacro Go--slice-data! (slice data)
  (declare (indent 1))
  `(setcar ,slice ,data))
(defmacro Go--slice-len! (slice len)
  (declare (indent 1))
  `(setcar (cdr (cdr ,slice)) ,len))

    (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)))
