Golang 开发实战day12 - Pointer

2024-05-07 18:36

本文主要是介绍Golang 开发实战day12 - Pointer,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🏆个人专栏
🤺 leetcode
🧗 Leetcode Prime
🏇 Golang20天教程
🚴‍♂️ Java问题收集园地
🌴 成长感悟
欢迎大家观看,不执着于追求顶峰,只享受探索过程

Golang 开发实战day12 - 指针

  在 Golang 中,指针是一种强大的工具,可以让我们直接操作内存中的数据。与其他编程语言相比,Golang 的指针更加轻量级,但也更灵活,这使得它在性能和开发效率之间取得了良好的平衡。

1、指针的基本概念

  指针就像一张指向内存中某个位置的地址的纸条。我们可以通过指针来访问和修改该位置的数据。

1.1 声明指针:

var p *int // 声明一个指向 int 型数据的指针

1.2 获取指针的值:

i := 10
p = &i // 将变量 i 的地址赋给指针 p
fmt.Println(*p) // 输出 10

1.3 修改指针的值:

*p = 20 // 将指针 p 指向的值修改为 20
fmt.Println(i) // 输出 20

2 示例代码

示例一

func updateName(x string) {x = "大雄"
}func main() {name := "哆啦A梦"updateName(name)fmt.Println("名字所在的内存地址:", &name)m := &namefmt.Println(m)fmt.Println(name)
}

Output:

底下就是帮助理解的结构,m是引用了name的指针,所以地址也是指向了name的地址。比较简陋,往君见谅。

    |---name---|-----m-----| |  0x001   |   0x002   ||----------|-----------|| "哆啦A梦" |   p0x001  ||----------|-----------|

示例二

type Person struct {Name stringAge  int
}func main() {person := Person{Name: "大雄", Age: 10}name := &person.Name // 获取指向 Name 字段的指针*name = "哆啦A梦"       // 修改 Name 字段的值age := &person.Age // 获取指向 Age 字段的指针*age = 12         // 修改 Age 字段的值fmt.Println(person)
}

Output:
在这里插入图片描述

3 指针的优点

  • 高效: 指针可以让我们直接操作内存中的数据,而无需进行额外的复制操作,因此效率更高。
  • 方便: 指针可以方便地传递和共享数据,而无需创建额外的副本。
  • 灵活: 指针可以让我们直接修改内存中的数据,而无需创建新的变量。

4 指针的注意事项

  • 指针不能指向不存在的数据: 确保指针指向的内存地址有效,否则会导致程序崩溃。
    不要同时使用多个指针指向同一块内存: 避免数据竞争,导致程序行为不可预料。
  • 释放不再使用的指针: 使用 defer 语句或其他方式释放不再使用的指针,避免内存泄漏。

5 指针的常见用法

  • 函数参数和返回值: 指针可以作为函数的参数和返回值,提高函数的效率和灵活性。
  • 结构体和数组: 指针可以用于访问和修改结构体和数组中的元素。
  • 内存管理: 指针可以用于手动管理内存,例如分配和释放内存空间。

这篇关于Golang 开发实战day12 - Pointer的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/968068

相关文章

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

Golang如何用gorm实现分页的功能

《Golang如何用gorm实现分页的功能》:本文主要介绍Golang如何用gorm实现分页的功能方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景go库下载初始化数据【1】建表【2】插入数据【3】查看数据4、代码示例【1】gorm结构体定义【2】分页结构体

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

在Golang中实现定时任务的几种高效方法

《在Golang中实现定时任务的几种高效方法》本文将详细介绍在Golang中实现定时任务的几种高效方法,包括time包中的Ticker和Timer、第三方库cron的使用,以及基于channel和go... 目录背景介绍目的和范围预期读者文档结构概述术语表核心概念与联系故事引入核心概念解释核心概念之间的关系

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加