加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Go语言 指针

发布时间:2020-12-16 18:54:17 所属栏目:大数据 来源:网络整理
导读:Go语言保留着C中值和指针的区别,但是对于指针繁琐用法进行了大量的简化,引入引用的概念。所以在Go语言中,你几乎不用担心会因为直接操作内寸而引起各式各样的错误。Go语言的指针,基本上只剩下用于区分 byref 和 byval 语义。 运算符就是简单的 和 * 一个

Go语言保留着C中值和指针的区别,但是对于指针繁琐用法进行了大量的简化,引入引用的概念。所以在Go语言中,你几乎不用担心会因为直接操作内寸而引起各式各样的错误。Go语言的指针,基本上只剩下用于区分 byref 和 byval 语义。

运算符就是简单的 & 和 * 一个取地址、一个解析地址。

 
package main
import(
"fmt"
)
func main(){
var i int // i 的类型是int型
i=1 //i 的值为 1;
var p *// p 的类型是[int型的指针]
p=&i         // p 的值为 [i的地址]
fmt.Printf("i=%d;p=%d;*p=%dn",i,p,*p)
*p=2 //*p 的值为 [[i的地址]的指针] (其实就是i嘛),这行代码也就等价于 i = 2
3 //验证想法
}
这段代码执行结果:

i=1;p=0x4212f100;*p=1
?i=2;p=0x4212f100;*p=2
?i=3;p=0x4212f100;*p=3

函数的参数传递可以看下面例子:
import type abc struct{
v int
func (a abc)aaaa(){ //传入的是值,而不是引用
a.v=1
"1:%dn",a.v)
func (a *abc)bbbb(){ //传入的是引用,而不是值
"2:%dn",128)">2
"3:%dn",128)">func (a *abc)cccc(){ "4:%dn",192)">aobj:=abc{}  //new(abc);
aobj.aaaa()
aobj.bbbb()
aobj.cccc()
输出结果:
 

1:1?2:0?3:2?4:2

传值与传指针当我们传一个参数值到被调用函数里面时,实际上是传了这个值的一份copy,当在被调用函数中修改参数值的时候,调用函数中相应实参不会发生任何变化,因为数值变化只作用在copy上。

传指针比较轻量级 (8bytes),只是传内存地址,我们可以用指针传递体积大的结构体。如果用参数值传递的话,在每次copy上面就会花费相对较多的系统开销(内存和时间)。所以当你要传递大的结构体的时候,用指针是一个明智的选择。

Go语言中string,slice,map这三种类型的实现机制类似指针,所以可以直接传递,而不用取地址后传递指针。(注:若函数需改变slice的长度,则仍需要取地址传递指针)

要访问指针 p 指向的结构体中某个元素 x,不需要显式地使用 * 运算,可以直接 p.x ;

一个稍微复杂的例子
type S map[string][]string
func Summary(paramstring)(s*S){
s=&S{
"name":[]string{param},
"profession":[]string{"Javaprogrammer","ProjectManager"},0)">"interest(lang)":[]"Clojure",0)">"Python",0)">"Go"},0)">"focus(project)":[]"UE",0)">"AgileMethodology",0)">"SoftwareEngineering"},0)">"hobby(life)":[]"Basketball",0)">"Movies",0)">"Travel"},192)">}
return s
s:=Summary("Harry")
"Summary(address):%vrn",s)
"Summary(content):输出:
Summary(address): 0x42131100?
Summary(content): map[profession:[Java programmer Project Manager] interest(lang):[Clojure Python Go] hobby(life):[Basketball Movies Travel] name:[Harry] focus(project):[UE Agile Methodology Software Engineering]]
?exit code 0,process exited normally.?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读