Go切片在指定索引插入数组的的固定写法

Go原生没有提供切片在指定索引添加元素或切片的方法,只有一个内置函数 apped()

所以采用 apped() 实现 在指定索引插入元素

以下为代码及分析

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// append() 从中间下标i插入元素
aslice = []int{1, 2, 3, 4, 5}
i := 3           // 下标 i
newElement := 10 // 新的元素
/*
    拆解步骤:
    1. appen(a, b):追加b元素到一个a切片
    2. 为了实现从中间添加,把原来的分为两部分:
            第一部分是 下标 i 前面的 记为 a
            第二部分是 下标 i 后面的
    3. 第二部分 再使用 appen() 和 下标 i 的元素 组成 一个新的切片 记为 b
    4. 将 第一部分 a 和  新的切片 b 组成 数组 c
*/
a := aslice[:i] // 第一部分 a
b := append([]int{newElement}, aslice[i:]...)
c := append(a, b...)
fmt.Println("原来的切片:", aslice) // 原来的数组: [1 2 3 4 5]
fmt.Println("新的切片", c)        // 新的数组 [1 2 3 10 4 5]

// 简写为一个
newSlice := append(aslice[:i], append([]int{newElement}, aslice[i:]...)...)
fmt.Println("简写:", newSlice) // 简写: [1 2 3 10 4 5]
fmt.Println("固定格式为:append(切片[:下标], append(新的元素, 切片[下标:]...)...)")

// 案例: 在切片aa []int{24,21,325,208,2370,32,65,321} 索引 index 为 5 处 新增一个切片bb []int{1,2,3}
aa := []int{24, 21, 325, 208, 2370, 32, 65, 321}
index := 5
bb := []int{1, 2, 3}
aa = append(aa[:index], append(bb, aa[index:]...)...)
fmt.Println(aa) // [24 21 325 208 2370 1 2 3 32 65 321]

封装为函数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
// Insert 泛型函数,在切片中指定位置插入新元素或切片
func Insert[T any](slice []T, index int, value any) []T {
	size := len(slice)

	if index < 0 || index > size {
		return slice
	}

	if v, ok := value.(T); ok {
		slice = append(slice[:index], append([]T{v}, slice[index:]...)...)
		return slice
	}

	if v, ok := value.([]T); ok {
		slice = append(slice[:index], append(v, slice[index:]...)...)
		return slice
	}

	return slice

}

调用

1
2
3
4
5
strSlice := append([]string{"apple", "pear"}, "orange")
fmt.Println(strSlice)

strSlice = Insert(strSlice, 2, "hahaha")
fmt.Println(strSlice)
最后更新于 Oct 07, 2024 10:58 +0800
使用 Hugo 构建
主题 StackJimmy 设计