在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
原文:https://www.jianshu.com/p/af42cb368cef ---------------------------------------------------- Go语言的指针与C或C++的指针类似,但是Go语言的指针不支持指针运算,这样就消除了在C或C++程序中一些潜在的问题。由于Go语言有自己的垃圾回收器,并且会自动管理内存,所以Go语言也不需要像C或C++一样使用free函数或者delete操作符。 Go语言的指针创建后可以像Java和Python中对象的引用一样使用。 在Go语言中,对于布尔变量或数值类型或字符串类型或数组都是按照值传递的:值在传递给函数或者方法时会被复制一份,然后方法或函数使用的是复制的这份值,也就不会对原值产生什么影响。一般情况下,对于布尔变量或数值类型或字符串类型的按值传递是非常廉价的,Go语言编译器会在传递过程中进行安全优化。 但是在Go语言中,字符串是不可变的,因此在进行修改字符串时(例如使用+=操作),Go语言必须创建一个新的字符串,然后复制原始的字符串并将其添加到新字符串之后,对于大字符串来说,操作的代价可能会比较大。 对于大字符串是这样,对于数组进行值传递也是如此。为了解决可能产生的巨大代价,Go语言使用数组切片来代替数组的使用。传递一个切片的代价跟传递字符串差不多,无论该切片的长度或容量是多大。对切片进行复制修改操作也不会像字符串那样需要创建新的切片,因为切片是可变的,属于引用类型。
Go语言中的引用类型有:映射(map),数组切片(slice),通道(channel),方法与函数。 由于Go语言存在垃圾回收器,因此在一个本地变量不再被使用时(不再被引用或者不在作用于范围)就会被垃圾回收器回收掉,这时本地变量的生命周期由它们的作用域决定。那如果我们想要管理本地变量的生命周期呢?这时就需要使用指针来管理本地变量,只要该变量至少存在一个指针,那么该变量的生命周期就可以独立于作用域。 使用指针能让我们控制变量的生命周期,不受作用域的影响,另外变量在传递过程中成本最小化,且可以轻易的修改变量的内容,而不是对复制的值进行操作。指针是一个变量,这个变量实际上是保存了另一个变量的内存地址,任何被指针保存了内存地址的变量都可以通过指针来修改内容。指针的传递非常廉价。 在使用指针前,我们需要明白两个操作符的含义 指针的创建与使用,可以看下面的代码实例
其实*p和变量a的值是相等的,两者可以交换着使用,两者都与同一块内存地址相关联,任意一个变量进行修改操作都会影响到另一个变量的值,但是若变量p被赋值其他变量的指针就不行了。 关于指针的综合运用,我们看以下的代码实例
根据上面代码,我们可以看到使用指针后,本来是值传递的整数类型在函数或方法中修改会影响到原变量的值。 空指针
以上实例输出结果为:
空指针判断:
多重间接引用
new函数与&操作符
从输出结果来看,new函数与&操作符两种方式区别不大,&操作符创建起来更加的简洁,并且随时可以指定属性初始值。Go语言打印指向person的指针时,会打印person属性的具体内容,并且在前缀上加上&表示该变量是一个指针。 接下来我们来传递一个结构体指针,并修改结构体的属性,看看Go语言是如何操作的。
main函数中创建一个pserson1对象,设置初始化属性后将它的指针传递到demo函数中,大家可以看到demo函数中有两种解引用(就是将一个指针转化为原对象)的方式,第一种: (*person).age是显示的解引用,第二种是使用 "." 操作符自动的将指针解引用,使用上这两种没什么区别,但第二种更简单。 作者:小杰的快乐时光 链接:https://www.jianshu.com/p/af42cb368cef 来源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。 |
请发表评论