Golang中切片元素的添加和删除copy

切片是一个动态数组,可以使用append()函数添加元素,Golang中并没有删除切片元素的专用方法,我们可以使用切片本身的特性来删除元素。由于,切片是引用类型,通过赋值的方式,会修改原有内容,Golang提供了copy函数来拷贝切片。

添加元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main

import "fmt"

func add_slice() {
var s1 = []int{}
s1 = append(s1, 100)
s1 = append(s1, 200)
s1 = append(s1, 300)
fmt.Printf("s1: %v\n", s1)
}

func main() {
add_slice()
}

运行结果

1
s1: [100 200 300]

删除元素

1
2
3
4
5
6
7
8
9
10
11
12
package main

import "fmt"

func delete_slice() {
var s1 = []int{1, 2, 3, 4}
s1 = append(s1[:2], s1[3:]...)//就是利用了取值范围左闭右开的特性
fmt.Printf("s1: %v\n", s1)
}
func main() {
delete_slice()
}

运行结果

1
s1: [1 2 4]

修改元素

1
2
3
4
5
6
7
8
9
10
11
12
package main

import "fmt"

func update_slice() {
var s1 = []int{1, 2, 3, 4}
s1[1] = 100
fmt.Printf("s1: %v\n", s1)
}
func main() {
update_slice()
}

运行结果

1
s1: [1 100 3 4]

查询元素

找到2这个值对应的索引是几

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main

import "fmt"

func query_slice() {
var s1 = []int{1, 2, 3, 4}
var key = 2
for i, v := range s1 {
if v == key {
fmt.Printf("i: %v\n", i)
}
}
}
func main() {
query_slice()
}

运行结果

1
i: 1

拷贝切片

这里的例子相当于0索引使用的内存地址是一样的,所以修改s2的时候s1也相同修改了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main

import "fmt"

func copy1_slice() {
var s1 = []int{1, 2, 3, 4}
var s2 = s1
s2[0] = 100
fmt.Printf("s1: %v\n", s1)
fmt.Printf("s2: %v\n", s2)
}
func main() {
copy1_slice()
}

运行结果

1
2
s1: [100 2 3 4]
s2: [100 2 3 4]

而如果使用copy,则可以不修改原有切片的值,但是要注意,这个例子中,要先给s2这个切片用make分配一下空间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main

import "fmt"

func copy2_slice() {
var s1 = []int{1, 2, 3, 4}
var s2 = make([]int, 4)
copy(s2, s1)
s2[0] = 100
fmt.Printf("s1: %v\n", s1)
fmt.Printf("s2: %v\n", s2)
}
func main() {
copy2_slice()
}

运行结果

1
2
s1: [1 2 3 4]
s2: [100 2 3 4]