切片 append 问题?

package main

import (
    "fmt"
)

func main() {
    arr := []int{1, 2, 3}
    add(arr)
    fmt.Println(arr)
}

// 这个函数不能有返回值,也不能定义全局变量, 怎么改变原切片的内容并返回
func add(arr []int) {
    arr = append(arr, 10)
}


// 实际输出  [1, 2, 3]
// 期望输出  [1, 2, 3, 10]
讨论数量: 10

package main

import (
“fmt”
)

func main() {
arr := []int{1, 2, 3}
add(&arr)
fmt.Println(arr)
}

// 这个函数不能有返回值,也不能定义全局变量, 怎么改变原切片的内容并返回
func add(arr *[]int) {
*arr = append(*arr, 10)
}

// 实际输出 [1, 2, 3]
// 期望输出 [1, 2, 3, 10]

3年前 评论

方法一:用指针的方式,传递变量的地址

package main

import "fmt"

func main() {
    arr := []int{1, 2, 3}
    add(&arr)
    fmt.Println(arr)
}

func add(arr *[]int) {
    *arr = append(*arr, 10)
}

方法二:给函数add一个返回值

package main

import "fmt"

func main() {
    arr := []int{1, 2, 3}
    arr = add(arr)
    fmt.Println(arr)
}

func add(arr []int) []int {
    arr = append(arr, 10)
    return arr
}
3年前 评论

我这种有点反常,地址一样,为啥值还是 [1,2,3]

package main

import (
    "fmt"
)

func main() {
    arr := make([]int, 0, 9)

    arr = append(arr, 1, 2, 3)

    add(arr)
    fmt.Println(arr)
    fmt.Printf("地址2: %p\n", arr)
}

// 这个函数不能有返回值,也不能定义全局变量, 怎么改变原切片的内容并返回
func add(arr []int) {

    arr = append(arr, 10, 11)
    fmt.Printf("地址1: %p\n", arr)
}

// 输出如下:
地址1: 0xc0000b6000
[1 2 3]
地址2: 0xc0000b6000
3年前 评论
夜幕下的风之 3年前
夜幕下的风之 3年前

@xuanjiang 你make的容量足够大,他们底层用的同一数组,试试arr := make([]int, 0)就会发现地址不一样

3年前 评论
xuanjiang 3年前

不要操作变量,操作指针即可。

3年前 评论

通过append返回的新切片,地址空间不一样了.

3年前 评论

arr = append(arr, …), 返回的是一个新的变量地址,切片的这个特性是golang使用时需要注意的一个坑。

另外,golang参数传递使用的是值拷贝,因此,如果希望输入参数的内容被改变并返回,需要使用指针。

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!