Go语言之流指针类型,new函数

news2024/12/23 16:49:19

计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用 4 个字节。为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。

我们将内存中字节的编号称为地址(Address)或指针(Pointer)。地址从 0 开始依次增加,对于 32 位环境,程序能够使用的内存为 4GB,最小的地址为 0,最大的地址为 0XFFFFFFFF。

数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量。
Go语言中使用对于指针存在两种操作: 取址和取值。

在这里插入图片描述

var x = 100
// 取址符:&  取值符:*
fmt.Println("x的地址:", &x)
// 将地址值赋值给的变量称为指针变量
var p *int
p = &x
fmt.Println("p的值:", p)
fmt.Println("p地址对应的值", *p)

在这里插入图片描述
关于地址的格式化打印

var x = 10
fmt.Printf("%p\n", &x)
x = 100
fmt.Printf("%p\n", &x)
fmt.Println(*&x)

关于指针的应用:

// 当使用等号将一个变量的值赋给另一个变量时,如 x = y ,实际上是在内存中将 i 的值进行了拷贝
var x = 10
var y = x
var z = &x
x = 20
fmt.Println(y)
fmt.Println(*z)
*z = 30
fmt.Println(x)

练习

var x = 10
var y = &x
var z = *y
x = 20
fmt.Println(x)
fmt.Println(*y)
fmt.Println(z) 

//=====================================

var a = 100
var b = &a
var c = &b
**c = 200
fmt.Println(a)

Go语言的指针类型变量即拥有指针高效访问的特点,又不会发生指针偏移和运算,从而避免了非法修改关键性数据的问题。

new函数

new 和 make 是 Go 语言中用于内存分配的原语。简单来说,new 只分配内存,make 用于初始化 slice、map 和 channel。
之前我们学习的基本数据类型声明之后是有一个默认零值的,但是指针类型呢?

在Go语言中,new函数和make函数都用于创建新的对象,但是它们有不同的用途和适用范围。

  1. new函数:new函数用于创建值类型的对象,并返回一个指向该对象的指针。它的语法是new(T),其中T表示类型。new函数会分配内存,并将分配的内存初始化为零值,然后返回指向该内存的指针。这个指针可以直接访问和操作对象的字段。例如:
p := new(int) // 创建一个新的int类型对象,并返回指向该对象的指针
fmt.Println(*p) // 输出0,因为内存被初始化为零值
*p = 42 // 修改对象的值
fmt.Println(*p) // 输出42
  1. make函数:make函数用于创建引用类型的对象,如切片、映射和通道,并返回一个已初始化的对象。它的语法是make(T, args),其中T表示类型,args表示用于初始化的参数。make函数会分配内存,并初始化对象的相关字段,返回一个可以直接使用的对象。例如:
s := make([]int, 5) // 创建一个长度为5的切片,并初始化为零值
fmt.Println(s) // 输出[0 0 0 0 0]
s[0] = 1 // 修改切片的值
fmt.Println(s) // 输出[1 0 0 0 0]

总结:

  • new函数用于创建值类型的对象,并返回一个指向该对象的指针。
  • make函数用于创建引用类型的对象,并返回一个已初始化的对象。
  • new函数只分配内存,不进行初始化,返回的是指向零值的指针。
  • make函数分配内存并进行初始化,返回的是已初始化的对象。

需要根据具体的需求和类型选择使用new函数还是make函数。

var p *int
// fmt.Println(p)  // <nil>
// fmt.Println(*p) // 报错,并没有开辟空间地址
*p = 10. // 报错

我们可以看到初始化⼀个指针变量,其值为nil,nil的值是不能直接赋值的。通过内建的new函数返回⼀个指向新分配的类型为int的指针,指针值为0xc00004c088,这个指针指向的内容的值为零(zero value)。

 var p *int = new(int)
    fmt.Println(p)  // 0x14000122008
    fmt.Println(*p) // 0
    *p = 10
    fmt.Println(*p) // 10

在这里插入图片描述

make返回的还是引⽤类型本⾝;⽽new返回的是指向类型的指针。后面再详细介绍

func1_指针1() {
	//&变量,获取变量地址
	var x = 10
	fmt.Printf("赋值之前x的对应地址:%p\n", &x)
	x = 100
	fmt.Printf("赋值之后x的对应地址:%p\n", &x)
	fmt.Println(x)
}
func2_指针2() {
	//取址
	//赋值
	//取值

	//(1) 或取地址:&变量
	var x = 10 //x称为整型变量
	//(2) 地址赋值:指针类型
	var p *int //p是一个整型指针类型
	p = &x     // var p = &x
	fmt.Println(p)
	//(3)取值操作,*指针变量
	fmt.Println(*p, reflect.TypeOf(*p))
}
func3_接收指针类型() {
	//指针类型存储地址值
	//地址本身也有一个类型
	var x = 10
	fmt.Println(&x)
	//p就是指针变量
	var p *int
	p = &x
	fmt.Println(p)
	fmt.Println(*p, reflect.TypeOf(*p))
	*p = 100
	fmt.Println(*p)
	fmt.Println(x)
}
func4_思考题() {
	var a = 1
	var b = a
	b = 100
	fmt.Println(a, b)
	//如何指向同一块儿空间
}
func5_指针案例3() {
	var a = 100
	fmt.Println(reflect.TypeOf(a))
	var b = &a
	fmt.Println(reflect.TypeOf(b))
	var c = &b
	fmt.Println(reflect.TypeOf(c))
	**c = 200
	fmt.Println(a)
}
func6_指针案例4() {
	p1 := 1   //p1类型
	p2 := &p1 //*int类型
	*p2++
	fmt.Println(p1)
	fmt.Println(*p2)
}
func7个_new函数1() {
	//基本数据类型(整型浮点型,字符串,布尔,数组,结构体,类型)属于值类型
	//值类型的特定:当声明未赋值之前存在一个默认值(zero value)
	var x int
	var name string
	fmt.Println(x, name)

	//指针类型属于引用类型,包括切片,map,channel都属于引用类型
	//引用类型当声明未赋值之前是没有开辟空间的,即没有默认值
	var p *int
	p = new(int)
	*p = 10
	fmt.Println(*p)
}

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

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

相关文章

MySQL-DDL-表结构操作

DDL&#xff08;表操作&#xff09; 表的创建 以具体代码的显示展示如何进行数据表的创建 CREATE DATABASE <数据库名>;CREATE TABLE <表名> (<列名1> <数据类型1> <约束>,<列名2> <数据类型2> <约束>,... ) 具体代码示例&am…

基于Spring Boot的高校专业学习预警系统设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的高校专业学习预警系统设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java sp…

C++正则表达式校验某个字符串是否是合格的email

C正则表达式校验某个字符串是否是合格的email 可以借助正则表达式校验某个字符串是否是合规的电子邮箱。对于邮箱的正则表达式有严格的模式&#xff0c;如&#xff1a;^[a-zA-Z0-9_&*-](?:\\.[a-zA-Z0-9_&*-])*(?:[a-zA-Z0-9-]\\.)[a-zA-Z]{2,7}$ 对应的C实现如下&a…

测试基础概念及常见开发模型和测试模型

目录 1.需求的概念 2.测试用例 3.什么是BUG 4.软件的生命周期 5.开发模型和测试模型 开发模型 瀑布模型 快速原型模型 螺旋模型 增量模型 敏捷方法 scrum三大角色 测试模型 V模型 W模型 1.需求的概念 衡量软件测试结果的依据—需求 概念&#xff1a;满足用户期…

变量与数据类型

专栏简介&#xff1a;本专栏作为Rust语言的入门级的文章&#xff0c;目的是为了分享关于Rust语言的编程技巧和知识。对于Rust语言&#xff0c;虽然历史没有C、和python历史悠远&#xff0c;但是它的优点可以说是非常的多&#xff0c;既继承了C运行速度&#xff0c;还拥有了Java…

互联网未来信任锚点,后量子计算标准与迁移势在必行

作者 | 宋慧 出品 | CSDN 云计算 图片 | 视觉中国 IT、数字化正在深刻改变和加速全行业的效率与创新。不过&#xff0c;互联网的信息通信安全基石——密码学技术仍在使用第一代公钥密码算法&#xff0c;而随着量子计算的产生发展&#xff0c;以离散对数和大数分解这类等价的数…

深入理解网络通信和TCP、IP协议-01

1、网络协议 计算机网络是什么&#xff1f; 随着计算机技术发展&#xff0c;计算机的体积和价格都在下降&#xff0c;之前计算机多用于研究机构&#xff0c;现 阶段逐步进入一般的公司用于办公。原来计算机之间传输数据需要通过软盘等第三方存储介 质进行转存&#xff0c;人们…

【CXL】CXL ATS 介绍

&#x1f525;点击查看精选 CXL 系列文章&#x1f525; &#x1f525;点击进入【芯片设计验证】社区&#xff0c;查看更多精彩内容&#x1f525; &#x1f4e2; 声明&#xff1a; &#x1f96d; 作者主页&#xff1a;【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#xff0c…

《代码随想录》专题:二叉树的遍历

0、二叉树的遍历方式总结 二叉树主要有两种遍历方式 深度优先遍历&#xff1a;先往深走&#xff0c;遇到叶子节点再往回走。广度优先遍历&#xff1a;一层一层的去遍历。 从深度优先遍历和广度优先遍历进一步拓展&#xff0c;才有如下遍历方式 深度优先遍历 前序遍历&#xff…

【网络编程】网络编程核心概念与模式

配套环境 vscode、gcc、ubuntu22.04 概念描述 网络编程的本质 使用操作系统提供的接口函数&#xff0c;使得应用程序具备收发网络数据的能力。 网络接口在代码层面是操作系统提供的函数 应用程序通过网络接口使用操作系统的联网能力 网络编程核心概念 协议&#xff1a;为进…

STM32——led灯的点亮+闪烁+流水灯的实现

文章目录 一、LED点亮1.原理2.寄存器方式--代码3.库函数--代码4.结果展示 二、LED闪烁三、LED流水灯1.代码2.结果展示 一、LED点亮 1.原理 其方式有两种一种是寄存器方式一种是库函数方式&#xff0c;但其原理都是一样的。如原理图所示&#xff0c;与LED相连接的IO口置低电平…

HTML学习 第一部分(前端学习)

参考学习网站: 网页简介 (w3schools.com) 我的学习思路是&#xff1a;网站实践视频。 视频很重要的&#xff0c;因为它会给你一种开阔思路的方式。你会想&#xff0c;噢&#xff01;原来还可以这样。这是书本或者网站教程 所不能教给你的。而且&#xff0c;对一些教程&#…

【深度解析】OSPF-开放式最短路径优先协议

目录 重点&#xff1a; VPN---Virtual Private Network(虚拟专用网络隧道) OSPF网络类型&#xff1a; 表格视图&#xff1a; P2P---点对点协议 BMA---广播多路访问网络 NBMA---非广播多路访问网络 P2MP---点对多点协议 OSPF认证&#xff1a;检测类型&#xff0b;密码 …

陪诊师接单app开发|陪诊小程序开发|陪诊师接单系统开发

随着人们健康意识的提高和医疗服务的不断完善&#xff0c;陪诊服务逐渐受到人们的关注和需求。为了满足顾客的需求&#xff0c;陪诊小程序应运而生。下面将介绍陪诊小程序开发的几个优势。   1. 提供方便的预约和服务体验   陪诊小程序可以让顾客随时随地通过手机预约陪诊服…

Java034——反射(Reflection)

一、Java中的反射及作用 Java的反射(reflection)机制是指在程序的运行状态中&#xff1a; 可以构造任意一个类的对象&#xff0c;可以了解任意一个对象所属的类&#xff0c;可以了解任意一个类的成员变量和方法&#xff0c;可以调用任意一个对象的属性和方法。 一句话&#…

3.类与对象

Java作为一种面向对象语言。支持以下基本概念&#xff1a; 多态继承封装抽象类对象实例方法重载 1.类与对象 对象&#xff1a;对象是类的一个实例&#xff0c;有状态和行为 类&#xff1a;类是一个模板&#xff0c;它描述一类对象的行为和状态 public class Dog {String bree…

编程语言里的转义字符真的叫转义字符吗?

我们先来看看别人是怎么说转义字符的&#xff1f; 这是我随便从两本书上截图来的&#xff0c;总的来说就是反斜杠加几个字符就是转义字符。 就问你晕不晕&#xff0c;斜杠加几个字符至少是两个字符&#xff0c;那还叫字符吗&#xff0c;那叫字符串吧&#xff0c;怎么取名转义字…

ModaHub魔搭社区:AI原生云向量数据库Zilliz Cloud与 LlamaIndex 集成搭建文档问答系统

目录 准备工作 准备数据 主要参数 处理数据 开始提问 本文将演示如何与集成 LlamaIndex 从指定源获取信息。 在 ChatGPT 占领各大头条时,越来越多的企业在考虑如何在它们的产品中使用 ChatGPT。一个比较大的使用场景就是如何使用 ChatGPT 来改造产品文档孱弱的搜索能力。…

【板栗糖GIS】——通过插件调教网页版b站首页

【板栗糖GIS】——通过插件调教网页版b站首页 参考视频&#xff1a;利用adblock关掉热搜和搜索推荐_哔哩哔哩_bilibili 在edge浏览器上使用的插件为Adblockplus&#xff0c;可以在插件中心查询到 拦截元素如下&#xff1a; bilibili.com##.adblock-tipsbilibili.com##.trend…

2023/7/15总结

JWT 在写项目的时候&#xff0c;本来想着把用户的数据全部存入session这样的话就不用每次都需要带用客户端的账号。后面了解到JWT&#xff0c;这个是在服务器无状态的一个方式。 具体是分为三个部分&#xff0c;第一个是头部主要存储用到的算法等信息&#xff0c;第二个是载荷…