GoLong的学习之路(六)语法之指针

news2025/5/13 16:43:33

书接上回,上回书中写道,数组已经和java中数组的区别。在go中数组的是数值类型,故需要指针指向数组的地址,从而进行修改。这次诉说,指针

文章目录

  • 指针
    • 指针地址
    • new和make
      • new
      • make

指针

区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针。(难度直接向下)

要搞明白Go语言中的指针需要先知道3个概念:指针地址、指针类型和指针取值。

指针地址

在内存中,一个数据需要存储,但是不能光存储,不去处理。要处理就必须在众多的数据中锁定我们所需的数据,这个就像,是在茫茫人海中一眼就看到你(只在灯火阑珊处)。所以此时就需要一个能够找到你的位置,也就是--------地址(在内存中,地址通常以32位,16进制表示)

我在程序中把赋值给变量A,把内存地址赋值给变量B。这时候变量B就是一个指针变量。

Go语言中的指针不能进行偏移和运算,因此Go语言中的指针操作非常简单,我们只需要记住两个符号:&(取地址)(获取引用)和 *(根据地址取值)(解引用)。

每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。

  • Go语言中使用 & 字符放在变量前面对变量进行“取地址”操作。

  • Go语言中的值类型(int、float、bool、string、array、struct)都有对应的指针类型,如:*int、*int64、*string等。

func main() {
	a := 10
	b := &a
	fmt.Printf("a:%d ptr:%p\n", a, &a) // a:10 ptr:0xc00001a078
	fmt.Printf("b:%p type:%T\n", b, b) // b:0xc00001a078 type:*int
	fmt.Println(&b)                    // 0xc00000e018
}

a :代表被取地址的变量,类型为 int
b:用于接收地址的变量,ptr的类型就为 *int,称做 int 的指针类型。*代表指针。

在这里插入图片描述

变量、指针地址、指针变量、取地址、取值的相互关系和特性:

  • 对变量进行进行取地址( & )操作,可以获取这个变量的指针变量
  • 指针变量的值是指针地址
  • 对指针变量进行取值( * )操作,可以获取指针变量指向的原变量的值
func main() {
	//指针取值
	a := 10
	b := &a // 取变量a的地址,将指针保存到b中
	fmt.Printf("type of b:%T\n", b)
	c := *b // 指针取值(根据指针去内存取值)
	fmt.Printf("type of c:%T\n", c)
	fmt.Printf("value of c:%v\n", c)
}

取地址操作符&和取值操作符*是一对互补操作符,&取出地址,*根据地址取出地址指向的值。

import "fmt"

func modifyArray(x int) {
	x = 100
}

func modifyArray2(x *int) {
	*x = 100
}

func main() {
	//指针取值
	a := 10
	modifyArray(a)
	fmt.Println(a)//10
	
	modifyArray2(&a)
	fmt.Println(a)//100
	
}

new和make

为什么会有这两个?其实我说实话我也挺懵逼的,看来到哪里都逃不过被new的命运。

在Go语言中对于引用类型的变量,我们在使用的时候不仅要声明它,还要为它分配内存空间,否则我们的值就没办法存储。

如错误例子:

func main() {
	var a *int
	*a = 100
	fmt.Println(*a)

}

在这里插入图片描述
在这里我只做了声明但是没有给他分配内存空间,所以在底层迟迟找不到,然后就报超时。

对于值类型的声明不需要分配内存空间,是因为它们在声明的时候已经默认分配好了内存空间。

所以为了让我们声明的引用类型有内存空间,所以此时我们就需要,引入两个关键字对这种变量分配内存空间。

Go语言中new和make是内建的两个函数,主要用来分配内存。(如果是C语言就需要有释放内存的步骤,但是Go有自动回收的机制)

new

new是一个内置的函数:它的函数签名如下:

func new(Type) *Type

在这里插入图片描述

  • Type表示类型,new函数只接受一个参数,这个参数是一个类型
  • *Type表示类型指针,new函数返回一个指向改类型内存地址的指针。

如何正确使用?

func main() {
	// 声明指针类型
	var a *int
	// 为指针类型分配内空间
	a = new(int)
	// 进行赋值
	*a = 10
	fmt.Println(*a)
}

var a *int只是声明了一个指针变量a但是没有初始化,指针作为引用类型需要初始化后才会拥有内存空间,才可以给它赋值。

总结一下:

  1. 声明指针类型
  2. 为指针类型分配空间
  3. 进行赋值

make

make也是用于内存分配,区别于new,它只是slice,map以及channel的内存创建,而且它返回的类型就是这三个类型本身,而不是他们的指针类型,因为这三种类型本身就是引用类型。所以没有必要去返回一个指针类型了。

make函数是无可替代的,我们在使用slice、map以及channel的时候,都需要使用make进行初始化,然后才可以对它们进行操作。(这三个函数在后续会有讲解)

make的函数签名:

func make(t Type, size ...IntegerType) Type
func main() {
	var b map[string]int
	b = make(map[string]int, 10)
	b["你好"] = 100
	fmt.Println(b)
}

用的还是之前的三板斧

new与make的区别

  1. 二者都是用来分配内存空间的
  2. make只试用slice、map、以及channel的初始话,返回的还是这三个引用类型本身;
  3. new使用于类型的内存分配,并且内存对应的值为类型默认值,返回的是指向类型的指针

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

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

相关文章

公立医院绩效考核系统源码,能适应医院多种绩效核算方式,技术架构:springboot、mybaits +avue +MySQL

医院绩效考核系统源码 ,绩效核算系统全套成品源码(有医院项目应用案例)可适应医院多种绩效核算方式。 系统概述: 医院绩效考核管理系统是采用B/S架构模式设计、使用JAVA语言开发、后台使用MySql数据库进行管理的一整套计算机应用…

从零开始学习wpsjs

1.这是一个简单的wpsjs学习文档,我是边学习wpsjs边记录学习的,希望对您的学习有所帮助 开发事项: 全局安装wpsjs:npm install -g wpsjsWpsjs create HelloWps 安装wps npm install -g wpsjs 新建一个wps加载项 输入命令wpsjs create HelloW…

代码随想录算法训练营第三十一天丨 贪心算法part02

122.买卖股票的最佳时机 II 思路 本题首先要理清楚两点: 只有一只股票!当前只有买股票或者卖股票的操作 想获得利润至少要两天为一个交易单元。 #贪心算法 这道题目可能我们只会想,选一个低的买入,再选个高的卖,…

LoongArch 指令集实验exp6

在借鉴了友佬的代码后,终于是跑通了测试。 1. 2. 4. 5. 6. 还需要改一个() assign sr64_result {{32{op_sra & alu_src1[31]}}, alu_src1[31:0]} >> alu_src2[4:0]; //rj >> i5

Panoply启动报错A Java Exception has occurred

Panoply启动报错A Java Exception has occurred 问题描述 原因 可能是版本不对,目前panoly只支持java11以后的了,我的java是8的,需要升级。 解决方案 删除原有的Java8重新安装Java11之后,即打开成功 安装Java11步骤

抓取网页的含义和URL基本构成

抓取网页是指通过爬虫程序从互联网上获取网页的内容和数据。抓取网页是爬虫的核心功能之一,通过抓取网页,可以获取到网页中的文本、图片、链接等信息,用于后续的数据分析、挖掘和应用。 URL(Uniform Resource Locator&#xff09…

了解并使用 jetty

前言 Jetty 是 Eclipse 基金会下的一个开源项目,它是一款用Java实现的、基于标准的HTTP服务器和JAVA Servlet容器。其优秀的性能和强大的可配置性使其在构建复杂和大规模的应用程序中非常受欢迎。在此篇文章中,我们将深入了解 Jetty,以及它如…

移远通信5G RedCap模组拿下首个中国移动5G物联网开放实验室5G及轻量化产品能力认证

10月21日,在2023世界物联网博览会期间,中国移动举办了以“智融万物 创见未来”为主题的物联网开发者大会暨物联网产业论坛。作为中国移动在物联网领域重要的合作伙伴,移远通信应邀参加论坛。 随着千行百业数智化进程的不断加速,5G…

【Java】Spring Cloud OAuth2之密码模式实战

Spring Cloud OAuth2 代码地址&#xff1a;https://gitee.com/kkmy/kw-microservices.git (又是一年1024&#xff0c;分享一下之前搭的OAuth2服务) OAuth2依赖版本 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud…

Kubernetes 部署 kubeflow1.6.1

前言 安装前请注意捋清楚版本关系&#xff0c;如kubeflow版本对应的K8S版本及其相关工具版本等等 我们此处使用的是是kubeflow-1.6.1和K8s-v1.22.8 单机部署 部署K8S 初始化Linux 1.关闭selinux setenforce 0 && sed -i "s/SELINUXenforcing/SELINUXdisable…

flutter开发实战-hero动画简单实现

flutter开发实战-hero动画简单实现 使用Flutter的Hero widget创建hero动画。 将hero从一个路由飞到另一个路由。 将hero 的形状从圆形转换为矩形,同时将其从一个路由飞到另一个路由的过程中进行动画处理。 Flutter Hero动画 Hero 指的是可以在路由(页面)之间“飞行”的 widge…

应用在PC机中的低功耗触摸感应芯片

PC机一般指个人计算机。个人计算机是指一种大小、价格和性能适用于个人使用的多用途计算机。台式机、笔记本电脑、小型笔记本电脑、平板电脑以及超级本等都属于个人计算机。计算机的发展主要按照构成计算机的电子元器件来划分&#xff0c;共分为四个阶段&#xff0c;即电子管阶…

作为语雀的深度用户,谈谈语雀崩溃

文章目录 语雀简介语雀不可用接近8小时&#xff0c;我的感受谈谈云端存储的主要缺点其他软件如何解决云端存储的缺点总结 语雀简介 在数字化时代&#xff0c;云端服务扮演着关键的角色&#xff0c;为个人和企业提供了各种在线服务。其中&#xff0c;协作与知识管理工具变得越来…

自考02378《信息资源管理》第一章信息资源管理基础——思维导图

备战2024年04月自考科目02378《信息资源管理》第一章信息资源管理基础 思维导图如下&#xff1a; 以上便是本文的全部内容了&#xff0c;不知道对你有没有帮助呢。 我会认真写好每一篇文章&#xff0c;一直努力下去&#xff01;

从京东API接口,三个数字,带你认识真正的京东工业

京东工业赴港上市&#xff0c;带着非常优秀的成绩。 招股书显示&#xff0c;2022年实现交易额223亿元&#xff0c;营收141亿元&#xff0c;调整后净利润7亿元。短短六年时间&#xff0c;已成为中国工业供应链技术与服务市场领导者。 京东工业与传统工业品贸易商有何不同&#x…

【2021集创赛】Digilent杯二等奖:基于FPGA的动态视觉感知融合的运动目标检测系统

杯赛题目&#xff1a;Diligent杯&#xff1a;基于FPGA开源软核的硬件加速智能平台 参赛组别&#xff1a;A组 设计任务&#xff1a; 利用业界主流软核处理器(仅限于Cortex-M系列及 RISC-V系列)在限定的DIGILENT官方FPGA平台上构建SoC片上系统&#xff0c;在 SoC中添加面向智能应…

猿辅导发布博物馆新知计划,上线文物科普记录片《文物也有AB面》

博物馆里有什么&#xff1f;文物&#xff0c;可能是大多数人脱口而出的答案。博物馆拥有包罗万象的文物&#xff0c;不仅能够传递知识&#xff0c;提供艺术养分&#xff0c;更有助于青少年增强文化自信和文化传承的使命感。一座博物馆就像一所大学校&#xff0c;一个能够普及知…

lwip多网卡自适应选择

当系统中有多个网卡时&#xff0c;lwip会选择第一个网卡作为默认网卡&#xff0c;ping、tftp、iperf都会选择第一个网卡来进行&#xff0c;没有办法使用第二个网卡&#xff08;一些命令可以通过-i选项选择网卡&#xff0c;有些命令则没有提供&#xff09;&#xff0c;此时需要修…

NSS [SWPUCTF 2021 新生赛]PseudoProtocols

NSS [SWPUCTF 2021 新生赛]PseudoProtocols 先看题目&#xff0c;题目要求我们先找到hint.php。 看这个get请求头&#xff0c;我们先用php://filter协议读一波 得到提示&#xff0c;让我们前往/test2222222222222.php 源码如下 <?php ini_set("max_execution_time&qu…

Excel怎么合并单元格?这4个方法很简单!

“有没有朋友知道Excel合并单元格应该怎么操作呀&#xff1f;在制作工作报表中&#xff0c;需要对Excel单元格进行合并操作&#xff0c;但是我不太熟悉详细的操作&#xff0c;希望大家帮帮我&#xff01;” 在Excel中&#xff0c;合并单元格是一项常用的操作&#xff0c;用于改…