func Cut(a []T, i, j int) []T {
	if !needsGC {
		return append(a[:i], a[j:]...)
	}
	copy(a[i:], a[j:])
	for k, n := len(a)-j+i, len(a); k < n; k++ {
		a[k] = zero
	}
	return a[:len(a)-j+i]
}
The following are taken from https://github.com/golang/go/wiki/SliceTricks

Cut, Delete, DeleteUnordered, Push, Pop, Reverse, Insert, InsertSlice
Cut removes all elements between i and j.
package slice
import (
	"reflect"
	"sort"
)
type T interface{}
func Any(s []T, fn func(T) bool) bool {
	return IndexFunc(s, fn) != -1
}
func All(s []T, fn func(T) bool) bool {
	return IndexFunc(s, func(e T) bool { return !fn(e) }) == -1
}
func IndexFunc(s []T, fn func(T) bool) int {
	for i, e := range s {
		if fn(e) {
			return i
		}
	}
	return -1
}
func Index(s []T, e T) int {
	return IndexFunc(s, func(el T) bool { return el == e })
}
var (
	zero    T
	needsGC = typeNeedsGC(reflect.TypeOf(zero))
)
func typeNeedsGC(t reflect.Type) bool {
	switch t.Kind() {
	case reflect.Map, reflect.Interface, reflect.Ptr, reflect.Chan, reflect.Slice:
		return true
	case reflect.Struct:
		n := t.NumField()
		for i := 0; i < n; i++ {
			if typeNeedsGC(t.Field(i).Type) {
				return true
			}
		}
		return false
	default:
		return false
	}
}