当前位置:网站首页>【go语言入门笔记】12、指针
【go语言入门笔记】12、指针
2022-08-04 05:28:00 【不负卿@】
指针是一个代表着某个内存地址的值
说到指针,会让许多人“谈虎色变”,尤其对指针偏移、运算、转换都非常恐惧。
其实,指针是使C/C++语言有极高性能的根本,在操作大块数据和做偏移时方便又便捷。
C/C++中指针饱受诟病的根本原因是指针运算和内存释放。
C/C++语言中的裸指针可以自由偏移,甚至可以在某些情况下偏移进入操作系统核心区域。
我们的计算机操作系统经常需要更新、修复漏洞的本质,是为解决指针越界访问所导致的“缓冲区溢出”。
指针概念在Go语言中被拆分为两个核心概念:
- 类型指针:允许对这个指针类型的数据进行修改。传递数据使用指针,而无须拷贝数据。类型指针不能进行偏移和运算。
- 切片,由指向起始元素的原始指针、元素数量和容量组成。
受益于这样的约束和拆分,Go语言的指针类型变量拥有指针的高效访问,但又不会发生指针偏移,从而避免非法修改关键性数据问题。同时,垃圾回收也比较容易对不会发生偏移的指针进行检索和回收。
1 、认识指针地址、指针类型
每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。
Go语言中使用&操作符放在变量前面对变量进行“取地址”操作。
格式如下:p := &变量
例:
package main
import (
"fmt"
)
func main() {
a := "hello"
p := &a //用符号 & 取变量a的地址
fmt.Println(p)
}
运行结果:
注:
- 输出了变量a的内存地址
- 输出值在每次运行是不同的
- 在32位平台上,将是32位地址;64位平台上是64位地址。
2、 从指针获取指针指向的值
在对普通变量使用&操作符取地址获得这个变量的指针后
可以对指针使用*操作,也就是指针取值
例:
package main
import (
"fmt"
)
func main() {
a := "hello"
p := &a
fmt.Println(p) //输出a的地址,p指针变量
fmt.Println(*p) //输出a的地址存储的值
}
运行结果:
3、使用指针修改值

package main
import (
"fmt"
)
func main() {
a := "hello" //变量a
p := &a //p指向a变量地址
b := "hello world" //变量b
*p = b //修改指针p指向的内存内容变
fmt.Println(a) //输出a的地址存储的值
}
运行结果:
4、new()函数创建指针
语法:指针变量 := new(数据类型)
例:
package main
import (
"fmt"
)
func main() {
c := new(string)
*c = "hello world"
fmt.Println(*c)
}
运行结果:
边栏推荐
猜你喜欢
随机推荐
记一次flink程序优化
关系型数据库-MySQL:二进制日志(binlog)
Zend FrameWork RCE1
完美解决keyby造成的数据倾斜导致吞吐量降低的问题
关于事件捕获和事件冒泡的顺序,以及如何处理事件冒泡带来的影响
剑指 Offer 2022/7/4
两个APP进行AIDL通信
SQL练习 2022/7/5
JS深复制对象方法(深拷贝)
Thread 、Handler和IntentService的用法
ISCC-2022
BUUCTF——MISC(一)
MySql--存储引擎以及索引
Matplotlib中的fill_between;np.argsort()函数
视图、存储过程、触发器
win云服务器搭建个人博客失败记录(wordpress,wamp)
剑指 Offer 2022/7/9
k3s-轻量级Kubernetes
智能合约安全——溢出漏洞
自动化运维工具Ansible(5)流程控制
![[NSSRound#1 Basic]](/img/0a/b2fc70947e3c76178d2faa86a1085d.png)








