5.2 Go 参数传递


在这里插入图片描述
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
在这里插入图片描述

  • 推荐:「stormsha的主页」👈,持续学习,不断总结,共同进步,为了踏实,做好当下事儿~

  • 专栏导航

    • Python系列: Python面试题合集,剑指大厂
    • Git系列: Git操作技巧
    • GO系列: 记录博主学习GO语言的笔记,该笔记专栏尽量写的试用所有入门GO语言的初学者
    • 数据库系列: 详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 运维系列: 总结好用的命令,高效开发
    • 算法与数据结构系列: 总结数据结构和算法,不同类型针对性训练,提升编程思维

    非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

    💖The Start💖点点关注,收藏不迷路💖

    📒文章目录

      • 引言
      • Go参数传递基础
        • 基本数据类型
        • 复合数据类型
      • 指针与参数传递
        • 使用指针传递
        • 指针传递的优势
      • 变长参数
        • 定义变长参数函数
        • 变长参数的使用场景
      • 接口与参数传递
        • 使用接口传递参数
        • 接口的优势
      • 结论
      • 参考文献


内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容

引言

Go语言以其简洁、高效而闻名,是现代软件开发中不可或缺的一部分。在Go语言中,参数传递是函数调用的核心机制之一。对于中高级开发者来说,深入理解Go的参数传递机制不仅有助于编写更高效的代码,还能避免一些常见的错误。本文将深入探讨Go语言的参数传递机制,并提供一些实用的使用技巧。

Go参数传递基础

在Go中,函数的参数传递是通过值传递(pass by value)实现的。这意味着当一个变量作为参数传递给函数时,函数接收到的是该变量的一个副本,而不是原始变量的引用。这种机制确保了函数的调用不会意外地修改原始变量的值。

基本数据类型

对于基本数据类型(如int、float64、bool等),参数传递是直接的。例如:

func increment(x int) int {return x + 1
}func main() {y := 5y = increment(y)fmt.Println(y) // 输出:6
}

在这个例子中,increment函数接收一个整数x,返回x+1。由于x是一个值的副本,所以increment函数对x的修改不会影响main函数中的y

复合数据类型

对于复合数据类型(如数组、结构体、切片等),虽然它们在函数间传递的也是值,但由于它们的大小通常比基本数据类型大,所以Go语言采用了一种特殊的机制来优化性能。复合数据类型的传递实际上是通过指针来实现的,这样可以避免复制整个数据结构的开销。

指针与参数传递

指针是Go语言中一个强大的特性,它允许开发者直接操作内存地址,从而实现对原始数据的引用传递。

使用指针传递

当需要修改原始数据时,可以通过传递指针来实现。例如:

func incrementPtr(x *int) {*x = *x + 1
}func main() {y := 5incrementPtr(&y)fmt.Println(y) // 输出:6
}

在这个例子中,incrementPtr函数接收一个指向整数的指针x,通过解引用操作*x来修改原始变量y的值。

指针传递的优势

使用指针传递有以下几个优势:

  1. 性能优化:避免了复制大型数据结构的开销。
  2. 数据共享:允许多个函数共享和修改同一个数据。
  3. 函数的灵活性:可以设计出更灵活的函数,如可以接受nil指针作为参数。

变长参数

Go语言支持变长参数,这使得函数可以接受任意数量的参数。变长参数在函数定义时使用...表示。

定义变长参数函数

func sum(args ...int) int {total := 0for _, arg := range args {total += arg}return total
}func main() {fmt.Println(sum(1, 2, 3, 4)) // 输出:10
}

在这个例子中,sum函数可以接受任意数量的整数参数,并通过遍历这些参数来计算总和。

变长参数的使用场景

变长参数在以下场景中非常有用:

  1. 函数重载:通过变长参数,可以模拟函数重载的行为。
  2. 灵活的接口设计:允许函数接受不同类型的参数。
  3. 简化函数调用:减少编写代码时的参数列表。

接口与参数传递

Go中的接口是一种强大的抽象机制,它允许函数接受任何实现了特定接口的类型作为参数。

使用接口传递参数

type Animal interface {MakeSound()
}func makeSound(animal Animal) {animal.MakeSound()
}func main() {dog := Dog{}makeSound(dog)
}

在这个例子中,makeSound函数接受一个实现了Animal接口的类型作为参数。这使得makeSound函数可以与任何实现了MakeSound方法的类型一起工作。

接口的优势

使用接口作为参数有以下优势:

  1. 代码复用:可以编写通用的函数,适用于多种类型。
  2. 解耦:减少代码间的依赖关系,提高模块化。
  3. 灵活性:允许开发者在运行时决定使用哪种类型。

结论

Go语言的参数传递机制是其核心特性之一,通过深入理解值传递、指针传递、变长参数和接口的使用,开发者可以编写出更高效、灵活和可维护的代码。掌握这些技巧对于中高级开发者来说至关重要,它们将帮助开发者在Go语言的世界中游刃有余。

参考文献

  1. The Go Programming Language Specification
  2. Effective Go
  3. Go by Example

🔥🔥🔥道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

💖The End💖点点关注,收藏不迷路💖

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

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

相关文章

【傻呱呱】VirtualHere共享局域网中的USB设备(使用Pavadan老毛子固件搭建篇)

前期准备 SSH工具(FinalShell)老毛子固件路由器一台 搭建VirtualHere服务端 进入VirtualHere官网下载对应处理器架构的包,我的是RT-N14U-GPIO路由器刷的老毛子固件,这种一般选择最后一个或者倒数第二个包,这里我选择…

Transformers集成SwanLab实现AI训练可视化监控

🤗HuggingFace Transformers Hugging Face 的 Transformers 是一个非常流行的开源库,它提供了大量预训练的模型,主要用于自然语言处理(NLP)任务。这个库的目标是使最新的模型能够易于使用,并支持多种框架&…

Topogun 3 for Mac——您的专业三维模型处理利器

Topogun 3 for Mac,无疑是三维模型处理领域的翘楚。该软件不仅功能全面,而且操作简便,能够满足您对于三维模型处理的各种需求。 导入高模、视图操作、新建拓扑层,一切都在您的掌控之中。Topogun 3强大的自动拓扑功能,…

小猪APP分发:一站式免费应用推广的理想平台

在日益拥挤的移动应用市场中,对于独立开发者和新兴应用而言,找到一个高效且成本效益高的分发渠道至关重要。这正是小猪APP分发平台www.appzhu.cn脱颖而出的原因,它不仅提供了一个全面的解决方案,帮助开发者免费推广他们的应用程序…

家政预约小程序06服务展示

目录 1 首页展示2 团购详情总结 在家政小程序中,最重要的信息就是各项服务的内容。顾客通过服务的信息,了解家政公司可以提供什么样的服务以及相关的收费。本篇我们介绍一下服务展示功能如何开发。 1 首页展示 在首页我们已经开发了活动展示、服务分类展…

月入25000,因何焦虑?

遇到一位铁粉经常给我点赞评论,没勾兑之前还以为他赋闲在家,没想到收入很高,要是放在5年前相比很多人都不会这么焦虑,那个时候大环境很好,随便跳个槽收入至少能增长30%。 这位铁粉从事java开发,目前就职于某…

C++ 程序的基本要素

一 标识符 程序中变量、类型、函数和标号的名称称标识符。 a,b,name,int,char,main,void等。 系统已有的标识符称为关键字。 常见关键字 using,namespace,void,return; int,float,double,char,bool,signed,unsignex, long,short,const,true,false,sizeof if,else,for,do,whil…

统信UOS专业版操作系统如何安装惠普打印机驱动

通用集成驱动安装方法 以惠普P1566激光打印机为例介绍一下,在打印机管理器中选择打印机,手动选择安装驱动,找到品牌:惠普,型号:1566,安装驱动后测试打印;LaserJet Pro P1566 Foomati…

单细胞 10X 和seurat对象学习

单细胞seurat数据的基础知识 rm(list ls()) library(Seurat) #注意这个报错 #Warning: Feature names cannot have underscores (_), replacing with dashes (-) folderslist.files(./,pattern[123]$) folders scList lapply(folders,function(folder){ CreateSeuratObject(…

系统安全扫描扫出了:可能存在 CSRF 攻击怎么办

公司的H5在软件安全测试中被检查出可能存在 CSRF 攻击,网上找了一堆解决方法,最后用这种方式解决了。 1、问题描述 CSRF 是 Cross Site Request Forgery的缩写(也缩写为也就是在用户会话下对某个 CGI 做一些 GET/POST 的事,RIVTSTCNNARGO一这…

Transformer详解(4)-前馈层残差连接层归一化

1、前馈层 前馈层接收自注意力层的输出作为输入。 from torch import nn import torch.nn.functional as Fclass FeedForward(nn.Module):def __init__(self, d_model512, d_ff2048, dropout0.1):super().__init__()# d_ff 默认设置为2048self.linear_1 nn.Linear(d_model,…

CentOS 7安装prometheus

说明:本文介绍如何在CentOS操作系统上安装prometheus Step1:下载安装包 访问Github仓库,下载对应版本的prometheus安装包 https://github.com/prometheus/prometheus/releases 操作系统的版本信息,可通过下面这两个命令查看&am…

【UE Slate】 虚幻引擎Slate开发快速入门

目录 0 引言1 Slate框架1.0 控件布局1.1 SWidget1.1.1 SWidget的主要作用1.1.2 SWidget的关键方法1.1.3 使用SWidget创建自定义控件1.1.4 结论 1.2 SCompoundWidget1.2.1 SCompoundWidget的主要作用1.2.2 SCompoundWidget的使用示例1.2.3 SCompoundWidget的关系1.2.4 总结 1.3 …

Linux 磁盘管理命令tune2fs mkisofs cfdisk sfdisk parted

文章目录 3.Linux 磁盘管理命令3.26 tune2fs:文件系统调整案例练习 3.27 mkisofs:建立ISO9660 映象文件案例练习 3.28 cfdisk:磁盘分区案例练习 3.29 sfdisk:硬盘分区工具程序案例练习 3.30 parted:磁盘分区工具案例练习 3.Linux 磁盘管理命令 3.26 tune2fs:文件系统调整 作用…

2024经济管理、社会科学与教育国际会议(ICEMSSE 2024)

2024经济管理、社会科学与教育国际会议(ICEMSSE 2024) 会议简介 2024年国际经济管理、社会科学和教育会议(ICEMSSE 2024)专注于经济、社会发展和教育。会议旨在为专家、学者和社会人士提供一个交流平台。通过讨论科学研究成果和前沿技术,我…

如何解包 Python 恶意可执行文件

使用 Python 编写的程序通常以源码的形式发布,也可以将所有依赖都打包到一个可执行文件中。那么如何解包 Python 恶意可执行文件呢? 打包 打包与加壳不同,打包 Python 程序的目的是创建一个可以在操作系统上独立运行的可执行文件。使用例如 …

【Qt】深入探索Qt事件处理:从基础到高级自定义:QEvent

文章目录 前言:1. 事件的介绍2. 事件的处理2.1. 示例1: 重写鼠标进入和鼠标离开事件2.2. 示例2:当鼠标点击时,获取对应的坐标值;2.3. 鼠标释放事件2.4. 鼠标双击事件2.5. 鼠标移动事件2.6. 鼠标滚轮的滚动事件 3. 按键…

初学C语言100题:经典例题节选(源码分享)

1.打印Hello World! #include <stdio.h>int main() {printf("hello world\n");//使用printf库函数 注意引用头文件return 0; } 2.输入半径 计算圆的面积 int main() {float r, s;//定义变量scanf("%f", &r);//输入半径s 3.14 * r * r;// 圆的…

H3CNE-8-ARP工作原理

ARP&#xff1a;Address Resolution Protocol 通过目的IP地址请求对方的MAC地址的过程。 数据链路层在进行数据封装时&#xff0c;需要目的MAC地址。 arp -a 查看 arp -d * 清空 主机A发送一个数据包给主机C之前&#xff0c;首先要获取C的MAC地址 数据封装

【C++】c++入门(下 )

c入门 1.内联函数1.1 概念1.2 特性 2.auto关键字(C11)2.1 简介2.2 auto的使用2.3 auto不能推导的场景2.4 typedef取别名也能产生和auto的效果&#xff0c;为什么不使用&#xff1f; 3.基于范围的for循环(C11)3.1 9.1 范围for的语法3.2 范围for的使用条件 4.指针空值nullptr(C11…