回答

收藏

slices是按值传递的吗?

技术问答 技术问答 232 人阅读 | 0 人回复 | 2023-09-12

在 Go 中,我正试图打乱我的旅行者问题slices功能。在执行此操作时,我注意到,当我开始编辑切片时,每次输入时,我都会给出不同的加扰功能。( _% T+ y" h4 I( z
经过一些调试,我发现这是因为我编辑了函数slices。但既然 Go 应该是 pass by value语言,这怎么可能?
1 Q% `) R& g/ d! e+ U0 [) A. thttps://play.golang.org/p/mMivoH0TuV
& g! I6 l9 u  m/ v& G8 |* ?, j我提供了一个操场链接来解释我的意思。通过删除第 27 线,您将获得与保留它不同的输出,因为该函数应该在作为参数输入时制作自己的切片副本。- _/ J  V. H4 R: Q% Z" k" e, }; ?
有人能解释这种现象吗?+ p) D' Z3 Y$ i5 C0 I6 F1 ^  {
                                                                " U* k# W: ?$ I& k
    解决方案:                                                                # N! K( b: e; B; x+ Z4 |) A
                                                                Go 中的所有内容都是按值传递的,切片也是如此。但切片值是一个header,描述了支持数组的连续部分,切片值仅包含指向实际存储元素的指针。切片值不包括其元素(不同于数组)。
1 M  d5 Y' U3 d2 m! I! z因此,当您将切片传输到函数时,从标头创建一个副本,包括指向同一备份数组的指针。修改切片的元素意味着修改支持数组的元素,因此共享相同支持数组的所有切片都将观察更改。
6 {3 W, Q# Y& h1 u) W0 w* d检查切片标头的内容,请检查reflect.SliceHeader类型:/ U; ?* H1 `. H, y4 a2 G/ I
    type SliceHeader struct    Data uintptr    Len  int    Cap  int}
    6 M: `& y  o& T( c
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则