Golang 语言中的指针介绍

介绍:

        指针式一种数据类型,用来存储值的内存地址,为了便于理解,我们也可以把指针未内存地址,指针类型只占用内存4个或 8 个字节,在Golang 语言中,类型名称加 *  表示改类型的指针类型。

        指针类型变量也需要一块内存空间储存值,指针变量的值就是它所指向数据的内存地址,而普通变量的值就是具体存放的数据,不同的指针类型变量之间无法互相赋值,在Golang 语言,指针不支持运算,也不能获取常量的指针

指针定义:

        在Golang 语言中,指针定义有3中方式:

        第一种方式是使用取地符 & 获取变量的指针(内存地址);

        第二种方式的使用var 关键字声明指针变量,使用var 关键字声明的变量不能直接赋值和取值,因为它还没有内存地址,它的值是nil;

        第三种方式是使用内置的new 函数来声明指针的变量,new 函数接收一个参数,可以传递类型给它,返回值是传递类型的指针类型。

实例代码:

func main() {a := 1p := &afmt.Println("变量a 的值为:", a)fmt.Println("变量a 的内存地址为:", p)fmt.Printf("变量a 的类型为 %T\n:", a)fmt.Printf("变量a 的类型为 %T\n:", p)//var str string//var p1 *int////p1 = &str////p2 := new(int)//fmt.Printf("%v %T\n",p2,p2)
}

 输出结果:

指针操作:

        在Golang 语言中,指针操作包括取值和修改,取值就是获取指针指向的值,只需在指针变量前加 * ;修改就是修改指针指向的值,需要注意的是使用 var 关键字声明的指针变量不能直接赋值和取值,因为它还没有它分配内存,它的值为nil ,可以使用内置函数 new 给它分配内存。

示例代码:

import "fmt"func main() {b := 2p3 := &bval := *p3fmt.Println("变量 val 的值为 ",val)*p3  = 3fmt.Println("*p3 指针指向的值为: ", *p3)fmt.Println("变量 b 的值为: ",b)var p4 *int = new(int)*p4 = 4fmt.Println(*p4)
}

执行结果:

指针应用:

        在Golang 语言中,函数传递参数只有值传递,传递的实参都是参数原始值的拷贝副本,所以我们传递类型的参数时,修改参数的值,原始数据不会被修改。但是,如果是指针类型的参数,修改参数的值,原始数据也会被修改,原因的指针类型的参数存储的事内存地址,并且和实参的内存地址相同。

示例代码:


func main() {mySalary := 80000fmt.Printf("变量 mySalary 的内存地址为: %p\n",&mySalary)modifySalary(mySalary)fmt.Println(mySalary)// 指针类型参数,实参的值被改变modifySalary2(&mySalary)fmt.Println(mySalary)}func modifySalary(salary int)  {fmt.Printf("参数变量的内存地址为: %p\n",&salary)salary = 100000
}func modifySalary2(salary *int)  {fmt.Printf("参数变量的内存地址为: %p\n",&salary)*salary = 100000
}

运行结果:

指针接收者:

        在Golang 语言中,定义一个方法,接收者可以的值类型和指针类型,二者都可以调用方法,因为Golang 编译器会自动转换,所以二者是等价的

        示例代码:

import "fmt"type worker struct {name   stringsalary uint
}func (w *worker) raise() {w.salary += 1000
}func (w worker) raise1() {w.salary += 1000
}func main() {w := worker{name:   "frank",salary: 5000,}// 指针类型接收者w.raise()fmt.Printf("w 的姓名是 %s,薪水是每月 %d\n", w.name, w.salary)// 值类型调用者w1 := worker{name:   "frank1",salary: 5000,}fmt.Printf("w 的姓名是 %s,薪水是每月 %d\n", w1.name, w1.salary)w2 := worker{name: "luck",salary: 5000,}w2.raise()fmt.Printf("w 的姓名是 %s,薪水是每月 %d\n", w2.name, w2.salary)w3 := worker{name: "luck1",salary: 5000,}w3.raise()fmt.Printf("w 的姓名是 %s,薪水是每月 %d\n", w3.name, w3.salary)
}

运行结果:

如果需要修改接收者,可以使用指针修改指针向数据的值。

如果接收者是非 map 、slice 和 channel 类型,并且数据比较大,可以使用指针来节省内存。

总结:

        本文我们介绍了Golang 语言中的指针,和指针定义与操作,并且介绍了指针为指针参数和指针接收者的应用区别。使用指针虽然可以修改数据的值和节省内存,但是也给开发带来复杂性,所以为了开发简单,在开发中处理必须使用指针类型外,尽量使用值类型,比如数据小的类型int  、 bool 和需要并安全的代码其实没有必要使用指针。

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

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

相关文章

Flink 状态管理设计详解:StateBackend、State、RocksDB和Namespace

为什么需要 StateBackend?—— 职责分离原则我们可以用一个银行的例子来类比:State (如 ValueState, ListState) 就像是你的银行卡。AbstractKeyedStateBackend 就像是银行的整个后台系统(包括总服务器、数据库、风控系统、会计系统等&#x…

橱柜铰链的革命:炬森精密如何以创新科技重塑家居体验

在现代化家居设计中,橱柜不仅是存储空间的核心,更是生活品质的象征。而作为橱柜的“关节”,橱柜铰链的性能直接影响着日常使用的便捷性、安全性和耐久性。然而,许多消费者在橱柜使用中常遭遇噪音干扰、频繁松动或早期损坏等痛点&a…

医疗系统国产化实录:SQL Server国产替代,乙方保命指南

医疗行业的SQL Server替代,和普通业务系统完全不是一个量级——医嘱逻辑嵌套几十层存储过程、收费结算小数点错位能引发医患纠纷、电子病历查询慢一秒医生直接拍桌子。作为被按在手术台上的乙方PM,实测四款主流国产库后,掏心窝子说句实话&…

WAIC 2025 盛大启幕,深思考邀您解锁端侧 AI 新可能​!

2025 世界人工智能大会今日正式启幕,深思考人工智能(iDeepWise)携端侧多模态大模型技术成果登陆展会,与行业伙伴共探端侧 AI 发展新机遇。作为专注于类端侧多模态大模型领域的创新力量,深思考此次重点展示了 iDeepWise…

MySQL相关概念和易错知识点(2)(表结构的操作、数据类型、约束)

目录1.表结构的操作(1)增加表(2)查看库中所有的表(3)查看表每个列的约束(4)删除整张表(5)删除某个具体的列(6)增加某个具体的列&#…

1. Qt多线程开发

目录方法1.继承QThread使用案例总结方法2.将qobject对象moveToThread(官方推荐)使用案例总结方法3.QRunnable QThreadPool使用案例总结方法4.快速线程QtConcurrentQFutureWatcher使用案例总结代码下载方法1.继承QThread 需要实现QThread的抽象函数run …

ARM入门学习方法分享

首先认识什么是ARM?ARM公司简介ARM是Advanced RISC Machines的缩写,它是一家微处理器行业的知名企业,该企业设计了大量高性能、廉价、耗能低的RISC (精简指令集)处理器。 1985年第一个ARM原型在英国剑桥诞生。公司的特点是只设计…

基于springboot的在线数码商城/在线电子产品商品销售系统的设计与实现

用户:数码产品,限时秒杀,种草分享,新品资讯,留言板,订单管理,在线客服,购物车,个人中心管理员:个人中心,用户管理,数码分类管理&#…

Zookeeper学习专栏(十):核心流程剖析之服务启动、请求处理与选举协议

文章目录前言一、服务端启动流程1.1 启动入口类:QuorumPeerMain1.2 集群模式启动核心:runFromConfig1.3 QuorumPeer线程核心逻辑:run()1.4 关键子流程:数据恢复1.5 关键设计要点二、请求处理链(责任链模式)…

网络基础19--OSPF路由业务多区域

一、OSPF多区域必要性单区域问题:LSDB庞大 → 内存占用高,SPF计算开销大LSA洪泛范围广 → 拓扑变化影响全域无法路由汇总 → 路由表膨胀,查找效率低2. 多区域优势:1. 划分区域:独立LSDB,缩小数据库规模2. 限…

MFC扩展库BCGControlBar Pro v36.2新版亮点:图形管理器等全新升级

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中,并为您节省数百个开发和调试时间。 BCGControlBar专业版 v36.2已全新发布了,在这个版本中添加了一个新的扩展器控件、改进了网格和报表…

QT开发---网络编程上

Qt Network 模块Qt Network 模块提供了丰富的类用于实现各种网络通信功能,涵盖 TCP、UDP、HTTP、FTP 等多种协议。 Qt 网络类均为异步操作,通过信号槽处理结果,避免阻塞 UI 线程。在使用QT进行网络编程之前,就必须在 CMakeLists.t…

[spring6: Mvc-函数式编程]-源码解析

接口 ServerRequest public interface ServerRequest {HttpMethod method();URI uri();UriBuilder uriBuilder();default String path() {return requestPath().pathWithinApplication().value();}default RequestPath requestPath() {return ServletRequestPathUtils.getPar…

Linux DNS 服务器正反向解析

一、环境说明与准备工作 1.基础信息 本次实验用两台 Linux 主机,分别作为 DNS 服务端和客户端,具体信息如下:服务端IP客户端IP网址192.168.120.130192.168.120.128www.zy.com2.准备工作 关闭安全软件:服务端和客户端都要关闭防火墙…

历史数据分析——中证旅游

中证旅游板块走势从月线级别来看2015年5月到2024年9月,月线上走出了一个震荡中枢的月线级别下跌段;目前月线级别底部放巨量,总体还在底部震荡,后续上涨的概率较大。从周线级别来看从2022年12月到2024年9月整体是下跌走势&#xff…

OpHReda精准预测酶最佳PH

1.显著改进:OpHReda通过检索嵌入数据增强机制,显著提高了酶最佳pH预测的准确性,相比现有方法提升了55%的F1分数。2.多尺度残差轻注意力模块:该模块结合了残差学习和多尺度特征提取,增强了模型对酶序列中残差级信息的捕…

醫護行業在未來會被AI淘汰嗎?

隨着AI的迅速發展,似乎所有職業都有被AI替代的風險,那麼醫療領域作為一個高技術依賴性的行業,有機會被淘汰嗎?我們今天就來說說,幾乎不可能被AI淘汰的職業---護理。一) AI在護理中扮演的角色i.) 臨床工作支持1. 健康監測自動化即…

大语言模型加速技术之KV Cache

大语言模型加速技术之KV CacheWhy we need KV Cache ?Self-Attention Without CacheSelf-Attention With CacheHuggingface 官方代码实现Why we need KV Cache ? 生成式generative模型的推理过程很有特点,我们给一个输入文本,模型…

代码随想录算法训练营第五十三天|图论part4

110.字符串接龙 题目链接&#xff1a;110. 字符串接龙文章讲解&#xff1a;代码随想录思路&#xff1a; 把每个字符串看成图的一个节点。 转换为求无权图两节点的的最短路径。求最短路径用bfs #include <string> #include <vector> #include <iostream> #i…

Java进阶4:泛型、序列化和反序列化

Java泛型 Java泛型是JDK5引入的一个新的特性&#xff0c;泛型提供了编译时的类型安全检测机制&#xff0c;这个机制运行程序员在编译的时候检测到非法的类型。泛型的本质是参数化类型&#xff0c;也就是所操作的数据类型被指定为一个参数。 泛型方法 可以写一个泛型方法&#x…