Golang 开发实战day11 - Pass By Value

2024-04-17 18:04

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

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

Golang 开发实战day11 - 按值传递

  在Go语言的世界里,变量就像一个个精灵球,存储着各种各样的数据。而赋值就像将数据从一个宝箱(精灵球)传递到另一个宝箱(精灵球)的过程。但是,你知道吗?Go语言中的赋值操作其实暗藏着玄机,它可以分为按值传递按引用传递两种方式。今天,就让我们一起走进Go语言的赋值世界,揭秘按值传递的秘密!

  按值传递:复制数据,开启独立旅程

  当我们使用按值传递时,就像大家最熟悉的硬盘备份一样,将老硬盘中的资源复制一份,然后将复制传递给大容量的新硬盘中。这不言而喻了吧,原来的硬盘资源完好无损,而新大容量硬盘中也拥有了相同的资源,但它们是两个完全独立的东西。

1. 变量分组

A 组B 组
StringsSlices
IntsMaps
FloatsSlices
Booleans
Arrays
Structs

  这些结构都是我们需要了解的,理解并掌握这两组类型的差异以及它们的工作方式对于我们今后工作还是比较重要的。其中Structs是比较特别的结构体,需要后期我们重点了解。下面是一些示例

2. 示例代码

func updateName(x string) {x = "大雄"
}func main() {// 组A : strings, ints, bools, floats, arrays, structsname := "小叮当"updateName(name)fmt.Println(name)
}

Output:
在这里插入图片描述
  代码中我声名一个name的变量,它是字符串类型。之后创建了一个updateName方法,可以传入string类型的x,以便我们之后进行调用。但是我们看到输出内容,“小叮当”并没有被覆盖掉。

  这是为什么呢?每次我们将一个值或一个变量传递到函数中的时候,都会创建一个变量的副本。所以updateName()中的name,并不是最开始的name;所以在update中更新的也只是副本的name,并不是我们原始的name值。是不是有些晕?没关系,那就在自己的编辑器里跑一遍就会理解了!

3. 计算机中的存储

  当然,这里更是为了方便大家理解,给出了上图说话
在这里插入图片描述

  这里说明原始的name在内存中的0x0002位置,而传递到方法中的副本x位置则是在0x0003位置。所以才导致不会改变原始值。
在这里插入图片描述
  那么如何改进让它进行修改呢?

func updateName(x string) string {x = "大雄"return x
}func main() {// 组A : strings, ints, bools, floats, arrays, structsname := "小叮当"name = updateName(name)fmt.Println(name)
}

Output:
在这里插入图片描述
  这里我们可以看到原始数据已被覆盖了!

  接下来我们以组B来作为示例

func updateMenu(y map[string] float64) {y["巧克力派"] = 8
}func main() {// 组 B -> slices, maps, functionsmenu := map[string] float64{"拿铁":	9.9,"汉堡": 13.9,}updateMenu(menu)fmt.Println(menu)
}

Output:

在这里插入图片描述
  不同于string的单独项目,这里menu是一个map,由于最初没有巧克力派,所以在调用UpdateMenu后,map中加入了巧克力派的信息。

4. 按值传递的优点:

  • 安全性高:由于不会影响源变量,因此可以避免意外修改源数据。
  • 易于理解:赋值操作直观易懂,不会引起混淆。

5 按值传递的缺点:

  • 效率低:对于大型数据结构,按值传递可能会导致大量的内存复制,降低运行效率。

6. 总结:

  按值传递是一种安全、易于理解的赋值方式,适用于传递基本类型数据和小型数据结构。但对于大型数据结构,按值传递可能会导致效率低下,因此建议使用按引用传递的方式。

  请记住,赋值操作看似简单,但背后却蕴含着Go语言的赋值机制。理解按值传递和按引用传递的差异,可以帮助你更有效地编写Go语言代码。

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



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

相关文章

golang 日志log与logrus示例详解

《golang日志log与logrus示例详解》log是Go语言标准库中一个简单的日志库,本文给大家介绍golang日志log与logrus示例详解,感兴趣的朋友一起看看吧... 目录一、Go 标准库 log 详解1. 功能特点2. 常用函数3. 示例代码4. 优势和局限二、第三方库 logrus 详解1.

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Python实战之屏幕录制功能的实现

《Python实战之屏幕录制功能的实现》屏幕录制,即屏幕捕获,是指将计算机屏幕上的活动记录下来,生成视频文件,本文主要为大家介绍了如何使用Python实现这一功能,希望对大家有所帮助... 目录屏幕录制原理图像捕获音频捕获编码压缩输出保存完整的屏幕录制工具高级功能实时预览增加水印多平台支持屏幕录制原理屏幕

最新Spring Security实战教程之Spring Security安全框架指南

《最新SpringSecurity实战教程之SpringSecurity安全框架指南》SpringSecurity是Spring生态系统中的核心组件,提供认证、授权和防护机制,以保护应用免受各种安... 目录前言什么是Spring Security?同类框架对比Spring Security典型应用场景传统

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并

OpenManus本地部署实战亲测有效完全免费(最新推荐)

《OpenManus本地部署实战亲测有效完全免费(最新推荐)》文章介绍了如何在本地部署OpenManus大语言模型,包括环境搭建、LLM编程接口配置和测试步骤,本文给大家讲解的非常详细,感兴趣的朋友一... 目录1.概况2.环境搭建2.1安装miniconda或者anaconda2.2 LLM编程接口配置2

Golang中拼接字符串的6种方式性能对比

《Golang中拼接字符串的6种方式性能对比》golang的string类型是不可修改的,对于拼接字符串来说,本质上还是创建一个新的对象将数据放进去,主要有6种拼接方式,下面小编就来为大家详细讲讲吧... 目录拼接方式介绍性能对比测试代码测试结果源码分析golang的string类型是不可修改的,对于拼接字