【GoLang基础】函数体的注意事项和细节讨论
在 Go 语言(Golang)中,函数是程序的基本构建块之一。理解函数的定义和使用是掌握 Go 语言的重要步骤。下面是关于 Go 语言中函数体的详细解释,包括函数的定义、参数传递、返回值以及闭包等方面。
1. 函数的定义
在 Go 语言中,函数使用关键字 func 来定义。函数的基本语法如下:
func functionName(parameterList) (returnTypeList) {// 函数体
}
- functionName 是函数名。
- parameterList 是参数列表,包括参数的名字和类型。
- returnTypeList 是返回值的类型,可以是一个或多个。
函数体包含函数的执行代码。
示例:
func add(a int, b int) int {return a + b
}
2. 参数传递
Go 语言支持传值和传引用两种方式来传递参数。
值传递
默认情况下,Go 语言的参数是通过值传递的。即函数内部修改参数不会影响到原来的变量。
示例:
func changeValue(x int) {x = 10
}func main() {a := 5changeValue(a)fmt.Println(a) // 输出: 5
}
引用传递
如果需要通过引用传递参数,可以使用指针。这样函数内部修改参数会影响到原来的变量。
示例:
func changeValue(x *int) {*x = 10
}func main() {a := 5changeValue(&a)fmt.Println(a) // 输出: 10
}
3. 返回值
函数可以返回一个或多个值。在函数定义时,需要在参数列表后面指定返回值的类型。
单个返回值
func add(a int, b int) int {return a + b
}
多个返回值
函数也可以返回多个值,这在需要返回错误信息时非常有用。
示例:
func divide(a int, b int) (int, error) {if b == 0 {return 0, fmt.Errorf("division by zero")}return a / b, nil
}
4. 命名返回值
在函数定义时,可以为返回值命名,这样在函数体内可以直接使用这些返回值变量,不需要显式声明。
示例:
func split(sum int) (x, y int) {x = sum * 4 / 9y = sum - xreturn // 使用命名返回值,直接返回 x 和 y
}func main() {a, b := split(17)fmt.Println(a, b) // 输出: 7 10
}
5. 闭包
Go 语言支持闭包(匿名函数)。闭包可以捕获和引用其所在环境中的变量。
示例:
func adder() func(int) int {sum := 0return func(x int) int {sum += xreturn sum}
}func main() {pos, neg := adder(), adder()fmt.Println(pos(1)) // 输出: 1fmt.Println(pos(2)) // 输出: 3fmt.Println(neg(-2)) // 输出: -2fmt.Println(neg(-3)) // 输出: -5
}
6. 方法
Go 语言中,函数可以附属于某个类型,这种函数称为方法。方法的定义与普通函数类似,但方法在函数名之前有一个特殊的接收者参数。
示例:
type Rectangle struct {width, height int
}func (r Rectangle) Area() int {return r.width * r.height
}func main() {rect := Rectangle{10, 5}fmt.Println(rect.Area()) // 输出: 50
}
7.小结
- 函数的形参列表可以是多个,返回值列表也可以是多个。
- 形参列表和返回值列表的数据类型可以是值类型和引用类型。
- 函数的命名遵循标识符命名规范,首字母不能是数字,首字母大写该函数可以被本包文件和其它包文件使用,类似public,首字母小写,只能被本包文件使用,其它包文件不能使用,类似private。
- 函数中的变量是局部的,函数外不生效
- 基本数据类型和数组默认都是值传递的,即进行值拷贝。在函数内修改,不会影响到原来的值。
- 如果希望函数内的变量能修改函数外的变量,可以传入变量的地址&,函数内以指针的方式操作变量。从效果上看类似引用
- Go函数不支持重载。函数也是一种数据类型,可以赋值给一个变量,则该变量就是一个在Go中,函数类型的变量了。通过该变量可以对函数调用。
- 函数既然是一种数据类型,因此在Go中,函数可以作为形参,并且调用!
- 为了简化数据类型定义,Go支持自定义数据类型基本语法:
type 自定义数据类型名 数据类型理解: 相当于一个别名
案例: type mylntint //这时mylnt 就等价int来使用了
案例: type mySum func(int,int)int // 这时mySum就等价一个函数类型func(int,int)int - 支持对函数返回值命名
- 使用_标识符,忽略返回值
func cal(n1 int ,n2 int) (sum int , sub int) {sum = n1 + n2sub = n1 - n2returnfunc main() {res1,_:= cal(10, 20)fmt.Printf("res1= %d ", res1)
- Go支持可变参数
func sum(nums ...int) int {total := 0for _, num := range nums {total += num}return total
}相关文章:
【GoLang基础】函数体的注意事项和细节讨论
在 Go 语言(Golang)中,函数是程序的基本构建块之一。理解函数的定义和使用是掌握 Go 语言的重要步骤。下面是关于 Go 语言中函数体的详细解释,包括函数的定义、参数传递、返回值以及闭包等方面。 1. 函数的定义 在 Go 语言中&am…...
YOLOv8训练流程-原理解析[目标检测理论篇]
关于YOLOv8的主干网络在YOLOv8网络结构介绍-CSDN博客介绍了,为了更好地学习本章内容,建议先去看预测流程的原理分析YOLOv8原理解析[目标检测理论篇]-CSDN博客,再次把YOLOv8网络结构图放在这里,方便随时查看。 1.前言 YOLOv8训练…...
实战使用Java代码操作Redis
实战使用Java代码操作Redis 1. 背景说明2. 单连接方式3. 连接池方式1. 背景说明 在工作中, 如果有一批数据需要初始化, 最方便的方法是使用代码操作Redis进行初始化。 Redis提供了多种语言的API交互方式, 这里以Java代码为例进行分析。 使用Java代码操作 Redis 需要借助…...
微信小程序之九宫格抽奖
1.实现效果 2. 实现步骤 话不多说,直接上代码 /**index.wxml*/ <view class"table-list flex fcc fwrap"><block wx:for"{{tableList}}" wx:key"id"><view class"table-item btn fcc {{isTurnOver?:grayscale…...
车牌检测识别功能实现(pyqt)
在本专题前面相关博客中已经讲述了 pyqt + yolo + lprnet 实现的车牌检测识别功能。带qt界面的。 本博文将结合前面训练好的模型来实现车牌的检测与识别。并用pyqt实现界面。最终通过检测车牌检测识别功能。 1)、通过pyqt5设计界面 ui文件如下: <?xml version="1…...
工业派-配置Intel神经计算棒二代(NCS2)
最近两天在工业派ubuntu16.04上配置了Intel神经计算棒二代——Intel Neural Compute Stick,配置过程之艰辛我都不想说了,实在是太折磨人。不过历尽千辛万苦,总算让计算棒可以在工业派ubuntu16.04系统上跑了,还是蛮欣慰的。 注&…...
深度学习中常见的九种交叉验证方法汇总
目录 1. K折交叉验证(K-fold cross-validation) 2. 分层K折交叉验证(Stratified K-fold cross-validation) 3. 时间序列交叉验证(Time Series Split) 4. 留一交叉验证(Leave-One-Out Cross-…...
企业建网站流程
企业建网站是一个复杂而繁琐的过程,需要根据企业的需求和目标进行规划、设计、开发和运营。以下是企业建网站的一般流程,主要包括以下几个步骤: 第一步:需求分析 企业建网站的第一步是进行需求分析。这个过程需要与企业负责人和相…...
Laravel通过phpSpreadsheet合并excel
背景 最近有一个需求,需要将所有excel文件的sheet合并到一个文件。 目前我们处理表格使用的是xlswriter这个插件,对于数据量比较大的话非常好用。...
CTF网络安全大赛web题目:just_sqli
这道题目是bugku的web题目 题目的 描 述: KosenCTF{} 原文链接: CTF网络安全大赛web题目:just_sqli - 红客网-网络安全与渗透技术 题目Web源代码: <?php$user NULL; $is_admin 0;if (isset($_GET["source"])) {highlig…...
Java入门基础学习笔记27——生成随机数
Random的使用:生成随机数。 随机数应用: 随机点名: 年会抽奖: 猜数字游戏: 密码学。 查看API文档: package cn.ensource.random;import java.util.Random;public class RandomDemo1 {public static voi…...
EasyImage2.0 图床源码
EasyImage2.0 是一个简单图床的源码,它支持以下功能: 1. API接口 2. 登录后才能上传图片 3. 设置图片质量 4. 压缩图片大小 5. 添加文字或图片水印 6. 设定图片的宽度和高度 7. 将上传的图片转换为指定的格式 8. 限制上传图片的最小宽度和高度 …...
人工智能创新领衔,Android系统如虎添翼:2024 Google I/O 大会深度解析
人工智能创新领衔,Android系统如虎添翼:2024 Google I/O 大会深度解析 2024年5月14日举行的Google I/O大会,犹如一场精彩的科技盛宴,吸引了全球的目光。大会上,谷歌发布了一系列重磅产品和技术更新,展现了…...
下单制造fpc的工艺参数
FPC工艺简介 - 百度文库 (baidu.com) FPC工艺参数 - 豆丁网 (docin.com) FPC柔性线路板的主要参数.ppt (book118.com) 捷多邦: 华秋: 背胶: FPC板背胶是可以粘接在光滑表面的一种薄型胶带,可以在狭小以及光滑的表面上用来提供高…...
位拆分与运算
描述 题目描述: 现在输入了一个压缩的16位数据,其实际上包含了四个数据[3:0][7:4][11:8][15:12], 现在请按照sel选择输出四个数据的相加结果,并输出valid_out信号(在不输出时候拉低) 0: 不输出且只有此时的输入有…...
windows11目标文件夹访问被拒绝-将安全信息应用到以下对象时发生错误
将安全性信息应用到以下对象时发生错误”解决办法 要夺取所有权时,点“安全”添加用户并允许所有权限后点击“应用”, 一直“无法保存对。。。(文件夹名)权限所在的更改。拒绝访问”啊 必须先点击“高级”,把“允许父项…...
C#thread线程传参数更新UI的文本框
C#线程的用法有几个不同的地方: 1、怎么启动线程? 2、是不是需要传入参数? 3、是不是要调用到UI中的控件,并对其进行更新? 关于启动线程,这里一个示例是在form中启动: 定义一个private:sta…...
基于Vue和uni-app的增强型单选ccRadioView组件开发
标题:基于Vue和uni-app的增强单选组件ccRadioView的设计与实现 摘要:本文将详细介绍如何使用Vue和uni-app构建一个简单、好用且通用的单选框组件ccRadioView。该组件提供了单选列表的功能,并支持反向传值,方便开发者快速实现单选…...
信息系统项目管理师0602:项目立项管理 — 历年考题(详细分析与讲解)
点击查看专栏目录 1、2017年11月第31题 题干: 项目经理小李依据当前技术发展趋势和所掌握的技术能否支撑该项目的开发,进行可行性研究。小李进行的可行性研究属于( )。 选项: A. 经济可行性分析 B. 技术可行性分析 C. 运行环境可行性分析 D. 其他方面的可行性分析 答案…...
vue2 中使用audio播放音频
<audio controls ref"audioPlayer" style"width:800px;"><source :src"obj.audioUrl" /></audio> data() {return {obj: {audioUrl: require(../../../../public/audio/video.wav)}}}, 有个地方一定要注意一下. 如果不写req…...
宽带任意阶贝塞尔光束模型与超表面实现案例
宽带任意阶 贝塞尔光束 超表面 模型 fdtd 案例内容:主要包括文章的两个贝塞尔光束模型,一个零阶贝塞尔光束一个一阶贝塞尔光束,采用二氧化钛介质单元执行几何相位来构建; 案例包括fdtd模型、fdtd设计脚本、Matlab计算代码和复现结…...
VRCT:打破VRChat语言壁垒的实时翻译与转录工具
VRCT:打破VRChat语言壁垒的实时翻译与转录工具 【免费下载链接】VRCT VRCT(VRChat Chatbox Translator & Transcription) 项目地址: https://gitcode.com/gh_mirrors/vr/VRCT 在全球化的虚拟社交平台VRChat中,语言差异常常成为跨文化交流的主…...
随着AI和电商重塑消费者购买行为,全球美妆市场增长10%
随着数字优先和AI影响下的全球电商加速发展,线上销售额增速达到线下门店的6倍 全球消费者情报领军企业NielsenIQ (NYSE:NIQ)今日发布《2026年美妆行业现状报告》。报告显示,全球美妆市场同比增长10%,电商销售额增速达到线下门店的6倍。该结果…...
震惊!这几款 AI 论文生成器居然能自动匹配真实参考文献,导师都惊呆了!
还在为论文参考文献瞎编、格式错乱、找不到权威文献而熬夜秃头?普通 AI 论文工具动不动就 "文献幻觉",编出一堆查无此篇的假引用,被导师一眼戳穿,直接打回重写!2026 年实测精选,这几款真正能自动…...
HTML 开发 - HTML 描述列表标签(<dl>、<dt>、<dd>)
HTML 描述列表标签 1、基本介绍在 HTML 中,<dl>、<dt>、<dd> 标签用于创建描述列表(Description List)描述列表是一种专门用于展示 术语 - 描述 或 名称 - 值 对结构的语义化标签标签说明<dl>Description List&#…...
快速生成git安装配置脚本,快马平台助你一键搭建版本控制环境
最近在帮团队新成员配置开发环境时,发现git安装这个看似简单的步骤,其实藏着不少坑。不同操作系统下的安装方式差异很大,新手经常要反复查阅各种教程。于是我用InsCode(快马)平台快速搭建了一个git安装配置助手,整个过程比想象中顺…...
WeChatExporter:免费开源工具,三步轻松备份你的微信聊天记录到电脑
WeChatExporter:免费开源工具,三步轻松备份你的微信聊天记录到电脑 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否担心过手机丢失、系统崩…...
Clawdbot 是如何实现永久记忆的?
下文是如何构建的在深入探讨记忆之前,我们先来理解模型在每次请求时能看到什么:[0] 系统提示词(静态指令 条件指令) [1] 项目上下文(引导文件:AGENTS.md、SOUL.md 等) [2] 对话历史(…...
华为2288H V3服务器iBMC配置全攻略:从默认密码到ESXi安装一步到位
华为2288H V3服务器iBMC与ESXi部署实战指南 对于企业IT基础设施团队而言,华为2288H V3服务器的灵活配置与高效管理能力使其成为数据中心建设的理想选择。本文将深入解析从基础配置到虚拟化平台部署的全流程,特别针对iBMC智能管理系统和VMware ESXi安装提…...
ESP8266上玩转MicroPython:四角按钮控制LED的3种接线方案对比
ESP8266上玩转MicroPython:四角按钮控制LED的3种接线方案对比 在物联网和智能硬件开发中,ESP8266凭借其出色的性价比和丰富的功能接口,成为了创客和开发者的首选。而MicroPython的出现,更是让Python开发者能够轻松上手硬件编程。本…...
