回答

收藏

slices是按值传递的吗?

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

在 Go 中,我正试图打乱我的旅行者问题slices功能。在执行此操作时,我注意到,当我开始编辑切片时,每次输入时,我都会给出不同的加扰功能。
* s0 n# a, d5 X# z$ k0 R经过一些调试,我发现这是因为我编辑了函数slices。但既然 Go 应该是 pass by value语言,这怎么可能?
6 p0 G; _- |/ W. V" J1 Vhttps://play.golang.org/p/mMivoH0TuV
6 }% B6 G& i, c* [$ @# G; e我提供了一个操场链接来解释我的意思。通过删除第 27 线,您将获得与保留它不同的输出,因为该函数应该在作为参数输入时制作自己的切片副本。
1 O( d5 V; i- ^! m) E有人能解释这种现象吗?" A3 `5 a/ m/ F. F' k/ F/ x
                                                                2 F' q! M) s$ b4 ?+ h: U1 Q
    解决方案:                                                               
! A$ D" F6 p/ v% U2 \                                                                Go 中的所有内容都是按值传递的,切片也是如此。但切片值是一个header,描述了支持数组的连续部分,切片值仅包含指向实际存储元素的指针。切片值不包括其元素(不同于数组)。# r+ }% e# c0 \5 x/ R
因此,当您将切片传输到函数时,从标头创建一个副本,包括指向同一备份数组的指针。修改切片的元素意味着修改支持数组的元素,因此共享相同支持数组的所有切片都将观察更改。: f- n( p( X# b! e
检查切片标头的内容,请检查reflect.SliceHeader类型:
5 G. G" d- L$ _$ S! b! L. M  j
    type SliceHeader struct    Data uintptr    Len  int    Cap  int}
    : B# @: f3 O* G$ j' b& }2 a  v
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则