怎么给slice添加一个通用的Insert方法?用反射折腾了好久qaq

类似

Insert(slice, pos, value)

共 4 个回复


stevenldj

用反射实现:

package main

import (
    "fmt"
    "reflect"
)

func Insert(slice interface{}, pos int, value interface{}) interface{} {
    v := reflect.ValueOf(slice)
    v = reflect.Append(v, reflect.ValueOf(value))
    reflect.Copy(v.Slice(pos+1, v.Len()), v.Slice(pos, v.Len()))
    v.Index(pos).Set(reflect.ValueOf(value))
    return v.Interface()
}

func main() {
    a := []int{1, 2, 3, 4, 5}
    fmt.Println(a)
    fmt.Println(Insert(a, 3, 0))

    b := []string{"a", "b", "c", "d", "e"}
    fmt.Println(b)
    fmt.Println(Insert(b, 3, "x"))

    c := []interface{}{1, "a", true, 3.2, 'a'}
    fmt.Println(c)
    fmt.Println(Insert(c, 3, false))
}

结果:

[1 2 3 4 5]
[1 2 3 0 4 5]
[a b c d e]
[a b c x d e]
[1 a true 3.2 97]
[1 a true false 3.2 97]
# 1

Begosu

万分感谢楼上的大大!

# 2

Begosu

func Insert(slice interface{}, pos int, value interface{}) interface{} {

    v := reflect.ValueOf(slice)

    ne := reflect.MakeSlice(reflect.SliceOf(reflect.TypeOf(value)), 1, 1)

    ne.Index(0).Set(reflect.ValueOf(value))
    v = reflect.AppendSlice(v.Slice(0, pos), reflect.AppendSlice(ne, v.Slice(pos, v.Len())))

    return v.Interface()
}
func main() {
    slice := []int{1, 2}

    fmt.Println(Insert(slice, 1, 99))

    slice2 := []string{"a", "c", "d"}

    slice2 = Insert(slice2, 0, "b").([]string)
    fmt.Println(Insert(slice2, 4, "e"))
}

输出

[1 99 2] 
[b a c  d e]

根据楼上的大大提示,我也写了一个。

# 3