【问题标题】:Go: Modifying slice within a function strange behaviour [duplicate]Go:在函数奇怪行为中修改切片[重复]
【发布时间】:2023-01-11 03:10:44
【问题描述】:

我是个新手,但最初我想弄清楚如何删除函数中切片中的最后一个元素。 我注意到在下面的代码中,函数 doThing 修改了 'thing' 切片,即使它没有作为指针传递。

package main

import (
    "fmt"
)
func doThing(arr []int) {
    arr = arr[:len(arr)-1]
    arr = append(arr, 1000)
}
func main() {
    thing := []int{1, 2, 3, 4, 5}
    doThing(thing)
    fmt.Printf("thing: %v\n", thing)
}

输出:thing: [1 2 3 4 1000]

预期:thing: [1 2 3 4 5]

如果我删除arr = arr[:len(arr)-1] 行,则不会修改“thing”切片。如果删除 arr = append(arr, 1000),也会发生相同的行为。

我的想法是,由于“thing”的长度在函数内没有变化,因此 arr 不会重新分配为新数组。

谁能解释为什么会这样?

【问题讨论】:

    标签: arrays go slice


    【解决方案1】:

    切片只是一个指向支持数组并保持切片长度和容量的标头,当您传递一个切片时,您正在创建此标头的副本,因此arrthing 的副本,因此更改@ 987654324@ header 不会更改 thing header,但是指向后备数组内容的更改对于 arrthing 两个标头都是可见的(只要更改发生在标头的长度内).

    请阅读:https://go.dev/blog/slices-intro

    【讨论】:

      猜你喜欢
      • 2020-03-27
      • 2018-02-12
      • 2019-12-13
      • 1970-01-01
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      • 2016-01-26
      • 1970-01-01
      相关资源
      最近更新 更多