美文网首页
go函数传递切片

go函数传递切片

作者: 甚解_4703 | 来源:发表于2020-04-22 18:49 被阅读0次

按理说,go函数传参都是值传递,但是某些情况也是能修改原值的,修改的方式与我想象中的又有些区别特此记录。

func testArraParam(v []int) {
    fmt.Printf("before testArraParam=%v,%p\n", v, &v)
    v[1] = 7               //修改数据
    v = append(v, 4, 5, 6) //添加数据
    fmt.Printf("after testArraParam=%v,%p\n", v, &v)
}

func main(){
    arra1 := make([]int, 0) //创建一个切片
    fmt.Printf("append arra=%v,%p\n", arra1, &arra1)
    arra1 = append(arra1, 1, 2, 3) //增加元素
    fmt.Printf("before arra=%v,%p\n", arra1, &arra1)
    testArraParam(arra1)
    fmt.Printf("after arra=%v,%p\n", arra1, &arra1)
}

实际结果输出:

append arra=[],0xc0000044e0
before arra=[1 2 3],0xc0000044e0
before testArraParam=[1 2 3],0xc000004540
after testArraParam=[1 7 3 4 5 6],0xc000004540
after arra=[1 7 3],0xc0000044e0

从结果看,函数里的 v[1] = 7生效了。。但好像又不是那么简单,因为后面的append操作没有影响到原来的切片。
指针地址上看的话,函数里的v参数原切片地址确实不是同一个,感觉有点类似c++中的别名,但是又有些区别。如果是别名append就会修改原值。这点在日常go使用中需要注意一下。


如果要想函数中的append生效的话,我们需要传递指针

func testArraParam2(v *[]int) {
    fmt.Printf("before testArraParam2=%v,%p\n", *v, v)
    (*v)[1] = 7              //修改数据
    *v = append(*v, 4, 5, 6) //添加数据
    fmt.Printf("after testArraParam2=%v,%p\n", *v, v)
}

//调用方式
/*
testArraParam2(&arra1)
fmt.Printf("after testArraParam2 arra=%v,%p\n", arra1, &arra1)
*/

打印结果

append arra=[],0xc00011c460
before arra=[1 2 3],0xc00011c460
before testArraParam=[1 2 3],0xc00011c4c0
after testArraParam=[1 7 3 4 5 6],0xc00011c4c0
after arra=[1 7 3],0xc00011c460

before testArraParam2=[1 7 3],0xc00011c460
after testArraParam2=[1 7 3 4 5 6],0xc00011c460
after testArraParam2 arra=[1 7 3 4 5 6],0xc00011c460

相关文章

  • go函数传递切片

    按理说,go函数传参都是值传递,但是某些情况也是能修改原值的,修改的方式与我想象中的又有些区别特此记录。 实际结果...

  • golang 切片在函数传递

    背景: 切片当参数传递时,无法append 原因: go语言中切片是地址传递,test函数添加的1,2,3后被分配...

  • 将切片作为方法参数进行传递

    在Go语言中,函数参数是按值传递的。当使用切片(slice)作为函数参数时,意味着函数将获得切片的副本:指向基础数...

  • 第03天(复合类型)_03

    13_数组做函数参数.go 14_数组指针做函数参数.go 15_切片的长度和容量.go 16_切片的创建.go ...

  • leetcode的Combination Sum题补充切片的传递

    Combination Sum以go 切片的传递 内容:回溯法。切片切为形参,为值传递。如果需要引用传递,要加指针...

  • Go 切片绕坑指南

    在Go中按值传递时,为什么有时会更改切片? 不知道大家有没有发现在一个函数内部对切片参数进行了排序后也会改变函数外...

  • 15.Go_Slice(切片)

    Go 切片 定义切片 切片初始化 len()和cap()函数 空(nil)切片 切片拦截 append() 和co...

  • Go 语言程序设计——集合类型(1)

    Go语言的所有内置类型:数组、切片和映射 值、指针和引用类型 值在传递给函数或者方法的时候会被复制一次 Go语言中...

  • golang系列教程

    Go包管理 Go开发工具 Go Doc 文档 Go 数组 Go 切片 Go Map Go 类型 Go 函数方法 G...

  • go 语言切片

    go 语言切片 简单切片 slice 是 对 array 的一个 view 创建简单切片 切片作为函数参数 对切...

网友评论

      本文标题:go函数传递切片

      本文链接:https://www.haomeiwen.com/subject/bhpwihtx.html