教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 【golang】slice底层函数传参原理易错点

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

发布时间:2022-01-14   编辑:jiaochengji.com
教程集为您提供【golang】slice底层函数传参原理易错点等资源,欢迎您收藏本站,我们将为您提供最新的【golang】slice底层函数传参原理易错点资源
<h4>切片底层结构</h4>

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

<pre><code class="lang-go hljs">type SliceHeader struct { Data uintptr Len int Cap int } </code></code></pre> <h4>以切片为参数调用函数</h4>

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

<pre><code class="lang-go hljs">func add(arr []int) { arr[0] = 99 } func main() { var a = make([]int, 2, 8) add(a) fmt.Println(a) } </code></code></pre>

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

<pre><code class="lang-go hljs">[99,0] </code></code></pre>

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

<pre><code class="lang-go hljs">func add(arr []int) { arr = append(arr, 10) } func main() { var a = make([]int, 2, 8) add(a) fmt.Println(a) } </code></code></pre>

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

<pre><code class="lang-go hljs">[0,0] </code></code></pre>

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

<pre><code class="lang-go hljs">arr = add(arr) </code></code></pre>
到此这篇关于“【golang】slice底层函数传参原理易错点”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
【golang】slice底层函数传参原理易错点
【GoLang】golang底层数据类型实现原理
golang 没有名字参数_说说不知道的Golang中参数传递
Golang Slice
[go语言]-slice实现的使用和基本原理
11.深入理解切片(slice)
golang 函数传多个参数_Golang中的参数传递示例详解
golang 解析struct为map_Golang 的引用类型底层实现
应用编程基础课第三讲:Go编程基础
理解 Go 编程中的 slice

[关闭]
~ ~