Golang 错误的初始化 Slice, 痛痛痛

错误的初始化 Slice, 痛痛痛

先上代码

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
package main

import "fmt"

func main() {
s := []string{"A", "B", "C"}

ns1 := newSlice1(s)
ns2 := newSlice2(s)

fmt.Printf("value = %+v, %p \n", s, s) //value = [A2 B C], 0xc00007a330
fmt.Printf("value = %+v, %p \n", ns1, ns1) //value = [A2], 0xc00007a330
fmt.Printf("value = %+v, %p \n", ns2, ns2) //value = [A2], 0xc00007a330
}

func newSlice1(s []string) []string {
ns := s[:0]
ns = append(ns, "A1")
return ns
}

func newSlice2(s []string) []string {
ns := s[:0]
ns = append(ns, "A2")
return ns
}

重构旧代码的时候, 发现了一些function里使用类似上面
ns := s[:0]
来出创建新的Slice, 就是不想导入包, 或少写一些代码

本以为还有我没学习到的奇技淫巧, 然而发现只要对这种新创建的切片做修改操作, 所有关联使用的地方都会出现修改

本质这些创建的切片指向的还是同一片内存空间

因为项目使用只是对切片做一些过滤, 然后返回出去, 这种问题被自然规避掉了


Golang 错误的初始化 Slice, 痛痛痛
https://maocat.cc/2021/07/06/blog/golang/error_init_slice/
发布于
2021年7月6日
许可协议