指针和参数传递(Go语言)
指针是存储另一个变量的内存地址的变量
<ul><li>变量是一种使用方便的占位符,变量都指向计算机的内存地址</li><li>一个指针变量可以指向任何一个值的内存地址</li></ul></li><li>获取变量的地址
Go语言的取地址符&,一个变量前使用&,会返回该变量的内存地址。
<pre><code class="lang-go hljs"><span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> a <span class="token operator">:=</span> <span class="token number">110</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"变量的地址:%x\n"</span><span class="token punctuation">,</span><span class="token operator">&</span>a<span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre> </li><li>指针特点
<ul><li>指针不能运算(不同于c语言)</li><li>Go语言中如果对指针进行运算会报错</li></ul></li></ul><h2>声明指针</h2>*T是指针变量的类型,它指向T类型的值。
var 指针变量名 *指针类型
<ul><li>*号用于之sing变量是一个指针</li><li>var ip *int //指向整型的指针</li><li>var fp *float64 //指向浮点型的指针</li></ul><h3>指针使用流程</h3> <ol><li>定义指针变量</li><li>为指针变量赋值</li><li>访问指针变量中指向地址的值</li><li>获取指针的值:在指针类型的变量前加上*号来获取指针所指向的内容</li></ol><h2>空指针</h2>GO 空指针
<ul><li>当一个指针被定义后没有分配到任何变量是,它的值为nil</li><li>nil指针也称为空指针</li><li>nil在概念上和其他语言null,NULL一样,都指代零值或空值</li><li>一个指针变量通常缩写为ptr</li></ul>空指针判断
<pre><code class="lang-go hljs"><span class="token keyword">if</span><span class="token punctuation">(</span>ptr <span class="token operator">!=</span> <span class="token boolean">nil</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span>ptr <span class="token operator">==</span> <span class="token boolean">nil</span><span class="token punctuation">)</span> </code></pre> <h2>指针数组</h2>指针数组:就是元素为指针类型的数组。
<ul><li>定义一个指针数组 <ul><li>var ptr [3]*string</li></ul></li><li>有一个元素个数相同的数组,将该数组中每个元素的地址赋值给该指针数组。也就是说该指针数组与某一个数组完全对应</li><li>可以通过*指针变量获取到该地址所对应的数值</li></ul><h2>双重指针</h2> <ol><li>如果一个指针变量存放的有事另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。
当定义一个指向指针的指针变量是,第一个指针存放第二个指针的地址,第二个指针存放变量的地址
</li><li>声明格式如下
<pre><code>```go </code></pre>var ptr **int
//以上指向指针的指针变量为整形
//访问指向指针的指针变量值需要使用两个*号
函数如果使用参数,该参数变量称为函数的形参。形参就像定义在函数体内的局部变量。调用函数,可以通过两种方式来传递参数:值传递和引用传递。
<h2>值传递</h2> <h3>概念</h3>值传递:是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改将不会影响到原内容数据。
<ul><li>默认情况下,Go语言使用的是值传递,即在调用过程中不会影响到原内容数据</li><li>每次调用函数,都将实参拷贝一份在传递到函数中。每次拷贝一份,性能就下降了。GO语言中使用指针和值传递配合避免了性能降低。</li></ul><h2>引用传递</h2> <h3>概念</h3>引用传递:是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到原内容数据
<ul><li>严格来说Go语言只有值传递一种传参方式,Go语言没有引用传递的</li><li>Go语言中可以借助指针来实现引用传递的效果。函数参数使用指针,传参时其实是在拷贝一份指针参数,也就是拷贝了一份变量地址</li><li>函数的参数如果是指针,当函数调用时,虽然参数仍然是按拷贝传递的,但拷贝仅仅是个指针(一个内存地址),这样就可以减少实参拷贝造成的内存浪费,时间开销,性能降低的情况</li></ul><h3>作用</h3> <ul><li>传指针使得多个函数能操作同一个对象</li><li>传指针更轻量级(8bytes),只需要传内存地址。如果参数是非指针参数,那么值传递的过程中,每次在拷贝上面就会花费较多的系统开销。所以当要传递大的结构体的时候,用指针是一个明智的选择</li><li>Go语言中的slice,map,channel类型的实现机制都是类似指针,所以可以直接传递,而不必取地址后传递指针</li></ul>您可能感兴趣的文章:
指针和参数传递(Go语言)
Golang语言基础教程:函数的参数
想系统学习GO语言(Golang
go语言值、指针和引用类型
关于golang面向接口
Golang指针的使用限制和unsafe.Pointer的突破之路
指针和固定大小缓冲区只能在不安全的上下文使用_「GCTT 出品」Go 语言机制之栈和指针...
Go 语言机制之栈和指针
go 语言学习历程
Go 语言函数