美文网首页golang 编程笔记
【golang】slice底层函数传参原理易错点

【golang】slice底层函数传参原理易错点

作者: dongzd | 来源:发表于2020-04-22 20:31 被阅读0次

切片底层结构

切片的底层结构主要包括引用数组的地址data,切片长度len与切片容量cap。

type  SliceHeader struct {
      Data uintptr
      Len int
      Cap int
}

以切片为参数调用函数

Go语言中,如果以切片为参数调用函数时,有时候会给人一种参数采用了传引用的方式的假象:因为
在被调用函数内部可以修改传入的切片的元素。
任何可以通过函数参数修改调用参数的情形,都是因为函数参数中传人了指针参数(只有底部结构有指针地址类型,都可以改变原值,因为虽然函数拷贝了参数的地址,但地址指向一个内存,所以能修改原来值)

func add(arr []int) {
    arr[0] = 99
}

func main() {
    var a = make([]int, 2, 8)

    add(a)

    fmt.Println(a)
}

因为add函数修改了指针指向内存的值,所以输出:

[99,0]

如果一切都为了说明以上特性,那这边文章将毫无意义,所以但是,但是................................................
切片传入函数,不仅结构中地址指针拷贝了一份,len与cap的值也拷贝了一份,重点来了
如果在函数内部改变的切片的长度或者容量,将不改变原先的值
如以下用法:

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

func main() {
    var a = make([]int, 2, 8)

    add(a)

    fmt.Println(a)
}

因为函数内部改变了len,这里的输出仍然是:

[0,0]

那该怎样通过函数即便改变了len与cap也能改变切片呢?
其实很简单,仿照append()方法,返回操作切片

arr = add(arr)

相关文章

  • 【golang】slice底层函数传参原理易错点

    切片底层结构 切片的底层结构主要包括引用数组的地址data,切片长度len与切片容量cap。 以切片为参数调用函数...

  • golang

    golang携程调度,runtime包 golang内存模型 csp原理 context的原理 slice底层结构...

  • slice切片做函数参数

    首先要明确一点:slice作为函数参数是值传递. 再来分析一下golang中的切片slice底层的实现细节...

  • 【golang】底层易错点总结

    闭包特殊性 闭包对捕获的外部变量并不是传值方式访问,而是以引用的方式访问。如以下defer 因为defer后面是一...

  • golang slice

    关于golang slice有很多大神写了很多文章,阐述了slice的底层实现和使用中注意点.这篇文章是我参考ht...

  • Golang Slice原理

    结构 扩容策略 当要扩成的大小newCap>2*currentCap,扩为newCap 当currentCap<1...

  • golang易错点

    sdfsdsdfs

  • go 基础复习

    易错点 map 与 slice 允许对值为 nil 的 slice 添加元素,但对值为 nil 的 map 添加元...

  • Golang函数

    函数 Golang函数特点 无需声明原型支持多返回值不定参数传参 也就是函数的参数个数不是固定的 但是后面的类型是...

  • golang笔记——深入了解Slice底层原理

    大家可以看下面这道关于slice的题目,通过这道题我们可以对slice的特性和注意事项有一个深入理解。 A. [0...

网友评论

    本文标题:【golang】slice底层函数传参原理易错点

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