当前位置:网站首页>Go语言指针介绍
Go语言指针介绍
2022-06-30 06:52:00 【段晓慢】
前言
与 Java 和 .NET 等编程语言不同,Go语言为程序员提供了控制数据结构指针的能力,但是,并不能进行指针运算。Go语言允许你控制特定集合的数据结构、分配的数量以及内存访问模式,这对于构建运行良好的系统是非常重要的。指针对于性能的影响不言而喻,如果你想要做系统编程、操作系统或者网络应用,指针更是不可或缺的一部分。
指针(pointer)在Go语言中可以被拆分为两个核心概念:
- 类型指针,允许对这个指针类型的数据进行修改,传递数据可以直接使用指针,而无须拷贝数据,类型指针不能进行偏移和运算。
- 切片,由指向起始元素的原始指针、元素数量和容量组成。
受益于这样的约束和拆分,Go语言的指针类型变量即拥有指针高效访问的特点,又不会发生指针偏移,从而避免了非法修改关键性数据的问题。同时,垃圾回收也比较容易对不会发生偏移的指针进行检索和回收。切片比原始指针具备更强大的特性,而且更为安全。切片在发生越界时,运行时会报出宕机,并打出堆栈,而原始指针只会崩溃。
认识指针地址和指针类型
一个指针变量可以指向任何一个值的内存地址,它所指向的值的内存地址在 32 和 64 位机器上分别占用 4 或 8 个字节,占用字节的大小与所指向的值的大小无关。当一个指针被定义后没有分配到任何变量时,它的默认值为 nil。指针变量通常缩写为 ptr。
return nil表示返回空,与JAVA里面的return null的写法不一样,但是意思一样,所以感觉很别扭,其实虽然都表示空,但是Go这里的nil表示的是指针。
每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。Go语言中使用在变量名前面添加&操作符(前缀)来获取变量的内存地址(取地址操作),格式如下:
ptr := &v // v 的类型为 T
其中 v 代表被取地址的变量,变量 v 的地址使用变量 ptr 进行接收,ptr 的类型为*T,称做 T 的指针类型,*代表指针。
指针实际用法,可以通过下面的例子了解:
代码中声明了两个变量,并使用了fmt.Printf 的动词%p打印 cat 和 str 变量的内存地址,指针的值是带有0x十六进制前缀的一组数据。
提示:变量、指针和地址三者的关系是:每个变量都拥有地址,指针的值就是地址。
从指针获取指针指向的值
当使用&操作符对普通变量进行取地址操作并得到变量的指针后,可以对指针使用*操作符,也就是指针取值,代码如下:
取地址操作符&和取值操作符*是一对互补操作符,&取出地址,*根据地址取出地址指向的值。
变量、指针地址、指针变量、取地址、取值的相互关系和特性如下:
- 对变量进行取地址操作使用&操作符,可以获得这个变量的指针变量。
- 指针变量的值是指针地址。
- 对指针变量进行取值操作使用*操作符,可以获得指针变量指向的原变量的值。
使用指针修改值
通过指针不仅可以取值,也可以修改值。
*操作符作为右值时,意义是取指针的值,作为左值时,也就是放在赋值操作符的左边时,表示 a 指针指向的变量。其实归纳起来,*操作符的根本意义就是操作指针指向的变量。当操作在右值时,就是取指向变量的值,当操作在左值时,就是将值设置给指向的变量。
创建指针的另一种方法——new() 函数
Go语言还提供了另外一种方法来创建指针变量,格式如下:
new(类型)
一般这样写:
str := new(string)
*str = "Go语言教程"
fmt.Println(*str)
new() 函数可以创建一个对应类型的指针,创建过程会分配内存,被创建的指针指向默认值。
边栏推荐
- 【模糊神经网络】基于模糊神经网络的移动机器人路径规划
- 原理:WebMvcConfigurer 与 WebMvcConfigurationSupport避坑指南
- MySQL中的InnoDB引擎
- Notes: environment variables
- Numpy中的四个小技巧
- ROS service communication programming
- The 40g high-efficiency cloud disk purchased by Alibaba cloud is only 20g attached
- Ftplib+ tqdm upload and download progress bar
- leetcode:98. Validate binary search tree
- Steps for formulating class or file templates in idea
猜你喜欢

Record one time of Tencent Test Development Engineer's automation interface test practice experience

1.9 - Cache

ROS system problem: rosdep init

MySQL优化:从十几秒优化到三百毫秒
![[fuzzy neural network] mobile robot path planning based on Fuzzy Neural Network](/img/39/c9bf235828b6d50e7931876fa4a918.png)
[fuzzy neural network] mobile robot path planning based on Fuzzy Neural Network

MySQL Optimization: from more than ten seconds to 300 milliseconds

Keil - the "trace HW not present" appears during download debugging

File Transfer Protocol,FTP文件共享服务器

【每日一题】535. TinyURL 的加密与解密

相关数据库问题提问。
随机推荐
【docsify基本使用】
Porting RT thread to s5p4418 (V): thread communication
Vscode returns the previous cursor (previous browse position)
1.4 - fixed and floating point numbers
[Hot100]回文子串 与 最长回文子串
Which securities company is good for opening a mobile account? Also, is it safe to open an account online?
Pay attention to this live broadcast and learn about the path to achieve the dual carbon goal of the energy industry
[Hot100]10. 正则表达式匹配
SOC_ SD_ CLK
gazebo/set_ model_ State topic driving UAV model through posture
RT thread migration to s5p4418 (I): scheduler
CPU到底是怎么识别代码的?
SOC project AHB_ SD_ Host controller design
RT thread Kernel Implementation (III): implementation of idle threads and blocking delay
Principle: webmvcconfigurer and webmvcconfigurationsupport pit avoidance Guide
It turns out that you are such an array. You have finally learned
freemarker
RT thread Kernel Implementation (VI): time slice
1.9 - Classification of memory
Huawei full-scale Daniel shared the 598 page full-color Manual of network protocols for the first time