GO语言中的指针

http://www.tizgrape.com/?p=100

Go语言中的指针语法和C++一脉相承,都是用*作为符号,虽然语法上接近,但是实际差异不小。

Go使用var定义变量:

var v6 *int  // int* v6;  (but no pointer arithmetic)
x = *p
(*int)(nil)  // function pointer

Go虽然有指针,但是没有指针算数,不能对其进行加减。但可以把指针值赋给另一个指针,因此Go的指针更像是C++的引用,却又没有C++中引用初始化后不能重新赋值的限制。

Go使用nil来表示无效指针,C++使用NULL(0)nullptr(C++11)来表示空指针。

当指向一个struct结构体时,Go的指针使用.而不是->来引用结构体的成员:

type myStruct struct { i int }
var v9 myStruct              // v9 has structure type
var p9 *myStruct             // p9 is a pointer to a structure
f(v9.i, p9.i)

指针在Go中是“安全”的,指针无法指向任意的内存区域,缓冲区溢出的问题不会发生。但注意,解引用一个空指针同样能导致Go程序崩溃。

指针的使用是和内存的分配紧密相关的。C&C++需要手动管理内存,然而Go使用垃圾收集器自动管理内存,这样就减少很多使用指针上的操心。首先我们再也不需要显示释放内存,悬挂指针(dangling pointer,指向已释放的内存)以及多次释放同一个指针指向内存的问题就不会发生。我们甚至不用担心内存是在栈上分配的还是堆上分配的。C++中的各种智能指针std::unique_ptr,std::shared_ptrstd::weak_ptrstd::auto_ptr也用不上了。一切都由Go的运行时系统帮助处理。

在Go中,取一个变量的地址是安全的,不会产生悬挂指针。如果在程序中取了一个变量的地址,编译器会自动在栈上分配这个变量,下面的三个函数是等价的:

type S { I int }func f1() *S {return new(S)
}func f2() *S {var s Sreturn &s
}func f3() *S {// More idiomatic: use composite literal syntax.return &S{}
}

反之,在C++函数中,返回一个函数局部变量的指针是一个低级错误。

// C++
S* f2() {S s;
  return &s;   // INVALID -- contents can be overwritten at any time
}

参考:
GoForCPPProgrammers

转载于:https://www.cnblogs.com/code-style/p/3770846.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/546504.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虚拟机VMware Workstation安装Linux服务器Debian11系统详细教程

虚拟机VMware Workstation安装Linux服务器Debian11系统详细教程如下: 准备好: 1.安装好虚拟机VMware Workstation 2.从Linux开源镜像下载的debian11镜像系统 从创建新的虚拟机开始 安装完系统重启进入系统,首先要做的是更新为阿里云的…

借力 Docker ,三分钟搞定 MySQL 主从复制!

hello 各位小伙伴大家好,今年 5 月份的时候,松哥和大家聊过如何搭建 MySQL 主从复制:提高性能,MySQL 读写分离环境搭建(一)提高性能,MySQL 读写分离环境搭建(二)不过很多小伙伴反映在 Linux 中安装 MySQL 比较费劲&…

java jaxb xml

http://blog.csdn.net/linjingj/article/details/17049641 http://blog.csdn.net/lw371496536/article/details/6942045 转载于:https://blog.51cto.com/arkshine/1422756

阿里云服务器Debian11系统安装Linux宝塔面板 搭建WordPress个人博客

阿里云服务器可以使用Debian11镜像系统,在安装Linux宝塔面板,配置LNMP(LinuxNginxMySQLPHP)后,再搭建WordPress个人博客。 一、安装Linux宝塔面板: https://www.bt.cn/ 复制debian安装linux宝塔面板命令&#xff0c…

面试官:聊一下你对MySQL索引的理解?

作者:浪人来源:http://t.cn/AiKmcEefMySQL索引?这玩意儿还能简单聊?明显是在挖坑,幸好老夫早有准备,切听我一一道来。 一、索引是什么?索引是帮助MySQL高效获取数据的数据结构。二、索引能干什么?索引非常…

Linux新建用户可以在shell中切换到该用户也能登录到图形桌面

解决使用useradd testname,passwd testname命令确实创建了一个用户,可以在shell中切换到该用户。但不能登录到图形桌面的问题! 通过下面方法可以在Linux中新建用户,并创建用户主目录,也能登录到图形桌面 1.普通用户先…

这样写Java,同事直呼666

作者:涛姐涛哥来源:cnblogs.com/taojietaoge/p/11575376.html一、MyBatis 不要写 11当遇到多个查询条件,使用where 11 可以很方便的解决我们的问题,但是这样很可能会造成非常大的性能损失,因为添加了 “where 11 ”的过…

Lync Server 2010 安装部署系列三:添加DNS记录

为了让客户端能够自动登录系统,我们需要在DNS服务器上设置创建相关的SRV记录,首先在DNS服务器上创建一条A记录pool.Contoso.com对应IP地址为192.168.1.11,然后创建一条SRV记录对应刚才创建的A记录,服务的内容为_sipinternaltls&am…

Linux系统下MySQL导出数据库和导入数据库的命令

一、MySQL导出数据库用mysqldump命令 注意mysql的安装路径,即此命令的路径,如果你只要查询mysql的运行文件所在地址,直接用下面的命令就可以了,再切换到mysql的运行文件的路径 which mysqlcd /usr/bin/1、导出数据和表结构 命令格…

工作中 99% 会用到的 Git 命令

作者:命中水来源:https://www.cxiansheng.cn/daily/4901.分支操作git branch 创建分支git branch -b 创建并切换到新建的分支上git checkout 切换分支git branch 查看分支列表git branch -v 查看所有分支的最后一次操作git branch -vv 查看当前分支git b…

JSP tomcat 更新不生效

2019独角兽企业重金招聘Python工程师标准>>> 今天遇到一问题,更改好的jsp部署到tomcat后,无论如何页面也不生效,最后才知道是tomcat的work目录没有清的原因,借此机会也特地看了下work目录的作用以及原理,做…

Win10专业版系统Docker安装、配置和使用详细教程

一、win10专业版系统首先需要开启硬件虚拟化及Hyper-V功能,才能进行Docker for Windows软件安装。 如何开启硬件虚拟化,自行百度。可在任务栏中查看虚拟化是否开启。 win10系统,打开控制面板-“应用”-“程序和功能”,开启Hyper…

框架开发之Java注解的妙用

作者:locality来源:https://www.jianshu.com/p/b560b30726d4如果你还不会使用注解,你肯定不好意思对别人说你学过Spring,你学过Mybatis,因为它们用了大量的注解。可见注解在开发领域已经使用的非常广泛了。注解的好处&…

Win10专业版系统PyCharm专业版使用WSL(ubuntu20.04 LTS)配置Docker解释器配置环境详细教程

提前准备好环境: Win10x64专业版21H2; WSL的ubuntu20.04系统; PyCharm2020专业版; Docker for Windows软件稳定版。 一、Win10系统安装WSL(ubuntu20.04 LTS)子系统 1.按照下图,开启“适用于Linux的Windows子系统”和“虚拟机平台”功能,按照提示重启计算机。 2.在Mic…

移动对meta的定义(转)

以下是meta每个属性详解尤其要注意的是content里多个属性的设置一定要用分号空格来隔开&#xff0c;如果不规范将不会起作用。一、<meta http-equiv"Content-Type" content"text/html; charsetutf-8"> //编码META标签是HTML语言HEAD区的一个辅助性…

Mybatis:颠覆你心中对事务的理解

作者&#xff1a;祖大俊来源&#xff1a;my.oschina.net/zudajun/blog/6667641.说到数据库事务&#xff0c;人们脑海里自然不自然的就会浮现出事务的四大特性、四大隔离级别、七大传播特性。四大还好说&#xff0c;问题是七大传播特性是哪儿来的&#xff1f;是Spring在当前线程…

msbuild构建时用SVN修改版本号代替AssemblyVersion的Revision版本号

持续构建需要标识出每次构建的版本&#xff0c;而每次构建的时候人工去修改版本是不现实的。靠程序去添加版本号&#xff0c;有3种可选&#xff1a;1) 顺序流水号&#xff1b;2) 时间戳&#xff1b;3) SVN检出代码的修订版本号1) 顺序流水号。需要每次构建将上次记录的流水号1&…

Docker镜像和容器常用命令

一、.Docker帮助命令 1.显示docker的版本信息 docker version 2.显示docker的系统信息&#xff0c;包括镜像和容器的数量 docker info3.docker帮助命令 docker 命令 --help二、Docker镜像命令 1.查看所有本地的主机上的镜像 docker images实例测试&#xff1a; 2.搜索镜像…

如何学会阅读源码?

作者 | youzhibing链接 | cnblogs.com/youzhibing/p/9553752.html1.读源码的经历刚参加工作那会&#xff0c;没想过去读源码&#xff0c;更没想过去改框架的源码&#xff1b;总想着别人的框架应该是完美的、万能的&#xff0c;应该不需要改&#xff1b;另外即使我改了源码&…

求模和求余

一直以为求模和求余是一回事&#xff0c;发现这两者是不同的。以下为网上转载的资料&#xff1a; 通常情况下取模运算(mod)和求余(rem)运算被混为一谈&#xff0c;因为在大多数的编程语言里&#xff0c;都用%符号表示取模或者求余运算。在这里要提醒大家要十分注意当前环境下%运…