15分钟学Go 第9天:函数的定义与调用
第9天:函数的定义与调用
欢迎来到第9天的Go语言学习模块!今天我们将深入探讨函数的定义与调用,帮助你掌握如何编写和使用函数。学习函数不仅是Go语言的基础,也是程序设计的核心概念之一。这一节将详细介绍函数的结构、参数传递、返回值、命名返回值以及切片和映射等在函数中的常用操作。
学习目标
- 理解函数的基本概念和结构
- 学会定义和调用函数
- 掌握参数传递和返回值的使用
- 学习命名返回值
- 掌握在函数中使用切片和映射
1. 函数的基本概念
函数是一个独立的代码块,可以被调用来执行特定的任务。在Go语言中,函数是一等公民,这意味着你可以将函数赋值给变量、作为参数传递给其他函数,或作为返回值返回。
函数的结构
定义一个函数通常包括以下几个部分:
- 函数声明
- 函数名
- 参数列表
- 返回值类型(可选)
- 函数体
函数的基本语法
func 函数名(参数1 类型, 参数2 类型) 返回值类型 {// 函数体
}
示例
func add(a int, b int) int {return a + b
}
在这个例子中,add是函数名,接受两个整数参数a和b,返回它们的和。
2. 定义和调用函数
2.1 定义函数
我们可以创建一个简单的函数来计算两个数的乘积。
func multiply(a int, b int) int {return a * b
}
2.2 调用函数
你可以通过函数名加上参数来调用函数。
func main() {result := multiply(3, 4)fmt.Println("The product is:", result)
}
完整示例代码
package mainimport "fmt"func multiply(a int, b int) int {return a * b
}func main() {result := multiply(3, 4)fmt.Println("The product is:", result)
}
运行过程图
+-------------------+
| main |
+-------------------+|v
+-------------------+
| multiply(3, 4) |
+-------------------+|v
+-------------------+
| Return 12 to |
| main |
+-------------------+|v
+-------------------+
| fmt.Println("The |
| product is: 12") |
+-------------------+
3. 函数参数与返回值
3.1 参数传递
Go语言支持多种参数类型和返回值类型,可以灵活地处理不同的功能需求。
示例:多个参数
func divide(a float64, b float64) float64 {return a / b
}func main() {result := divide(10.0, 2.0)fmt.Println("10.0 divided by 2.0 is:", result)
}
3.2 返回多个值
Go可以返回多个值,这是它的一个特别之处。例如,我们可以创建一个函数来返回商和余数。
func divideAndRemainder(a int, b int) (int, int) {return a / b, a % b
}func main() {quotient, remainder := divideAndRemainder(10, 3)fmt.Println("Quotient:", quotient, "Remainder:", remainder)
}
3.3 完整返回示例代码
package mainimport "fmt"func divideAndRemainder(a int, b int) (int, int) {return a / b, a % b
}func main() {q, r := divideAndRemainder(10, 3)fmt.Println("Quotient:", q, "Remainder:", r)
}
运行过程图
+-------------------+
| main |
+-------------------+|v
+-------------------+
| divideAndRemainder(10, 3) |
+-------------------+|v
+-------------------+
| Return (3, 1) |
+-------------------+|v
+-------------------+
| Print "Quotient: 3, Remainder: 1" |
+-------------------+
4. 命名返回值
在Go语言中,函数可以使用命名返回值。命名返回值可以使代码更具可读性。
示例
func namedReturn(a int, b int) (sum int) {sum = a + breturn // 直接返回命名返回值
}func main() {res := namedReturn(5, 7)fmt.Println("The sum is:", res)
}
运行过程图
+-------------------+
| main |
+-------------------+|v
+-------------------+
| namedReturn(5, 7) |
+-------------------+|v
+-------------------+
| sum = 12 |
+-------------------+|v
+-------------------+
| Return 12 |
+-------------------+
5. 在函数中使用切片和映射
5.1 在函数中使用切片
切片是Go语言中非常重要的一种数据结构。我们可以定义一个函数来计算切片的总和。
func sumSlice(numbers []int) int {sum := 0for _, num := range numbers {sum += num}return sum
}func main() {nums := []int{1, 2, 3, 4, 5}total := sumSlice(nums)fmt.Println("Sum of slice:", total)
}
5.2 在函数中使用映射
映射(map)可以让你存储键值对。我们可以创建一个函数来遍历映射,并返回所有值的总和。
func sumMap(values map[string]int) int {sum := 0for _, val := range values {sum += val}return sum
}func main() {myMap := map[string]int{"a": 1, "b": 2, "c": 3}total := sumMap(myMap)fmt.Println("Sum of map values:", total)
}
完整示例代码
package mainimport "fmt"func sumSlice(numbers []int) int {sum := 0for _, num := range numbers {sum += num}return sum
}func sumMap(values map[string]int) int {sum := 0for _, val := range values {sum += val}return sum
}func main() {nums := []int{1, 2, 3, 4, 5}totalSlice := sumSlice(nums)fmt.Println("Sum of slice:", totalSlice)myMap := map[string]int{"a": 1, "b": 2, "c": 3}totalMap := sumMap(myMap)fmt.Println("Sum of map values:", totalMap)
}
运行过程图
+-------------------+
| main |
+-------------------+|v
+-------------------+
| sumSlice([1,2,3,4,5]) |
+-------------------+|v
+-------------------+
| Return 15 |
+-------------------+|v
+-------------------+
| sumMap({"a":1,"b":2,"c":3}) |
+-------------------+|v
+-------------------+
| Return 6 |
+-------------------+
6. 总结
在本节中,我们详细探讨了Go语言的函数定义与调用的过程。我们学习了如何定义简单和复杂的函数,掌握了参数及返回值的使用,同时还了解了命名返回值和在函数中使用切片与映射的操作。
在实际编程中,函数的合理使用可以极大地提高代码的可复用性、可读性和结构性。希望通过这一天的学习,你对Go语言中的函数有了更深刻的理解。
7. 小练习
为了巩固所学知识,建议你完成以下小练习:
- 编写一个函数,接受一个字符串切片,返回所有字符串的长度之和。
- 编写一个函数,接受一个映射,返回值的最大值。
- 编写一个函数,接受一个切片,返回一个新的切片,包含所有偶数元素。
完成小练习后,你可以在下一节中分享你的成果,我们将进行讨论和反馈。
怎么样今天的内容还满意吗?再次感谢观众老爷的观看,关注下方GZH,回复666,送您价值199的AI大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!

相关文章:
15分钟学Go 第9天:函数的定义与调用
第9天:函数的定义与调用 欢迎来到第9天的Go语言学习模块!今天我们将深入探讨函数的定义与调用,帮助你掌握如何编写和使用函数。学习函数不仅是Go语言的基础,也是程序设计的核心概念之一。这一节将详细介绍函数的结构、参数传递、…...
Java虚拟机:JVM介绍
1024 程序员节日快乐!愿您我的代码永远没有 bug ,人生永远没有 bug ! JVM 概述JVM 架构 概述 JVM( Java Virtual Machine ,Java 虚拟机),是 Java 语言的运行环境,是运行所有 Java 程…...
R数据科学 16.5.3练习题
(1) 编写代码以使用一种映射函数完成以下任务。 a. 计算 mtcars 数据集中每列的均值。 b. 确定 nycflights13::flights 数据集中每列的类型。 c. 计算 iris 数据集中每列唯一值的数量。 d. 分别使用 μ -10、0、10 和 100 的正态分布生成 10 个随机数。 library(purrr) # 计算…...
通过conda install -c nvidia cuda=“11.3.0“ 安装低版本的cuda,但是却安装了高版本的12.4.0
问题 直接通过 conda install -c nvidia cuda"11.3.0"安装得到的却是高版本的 不清楚原理 解决方法 不过我们可以分个安装 runtime toolkit 和 nvcc 安装指定版本的 cudatoolkit 和 nvcc conda install -c nvidia cuda-cudart"11.3.58" conda instal…...
简易CPU设计入门:验证取指令模块
项目代码下载 还是请大家首先准备好本项目所用的源代码。如果已经下载了,那就不用重复下载了。如果还没有下载,那么,请大家点击下方链接,来了解下载本项目的CPU源代码的方法。 下载本项目代码 准备好了项目源代码以后ÿ…...
【MySQL数据库】MySQL主从复制
文章目录 MySQL主从复制MySQL主从复制的分类MySQL主从复制原理MySQL主从复制的配置步骤MySQL主从复制的同步模式 MySQL主从复制实验环境准备关闭防火墙和 SELinux时间同步主服务器设置从服务器设置 MySQL 主从复制配置主服务器配置从服务器配置(以 Slave1 为例&…...
CDC变更数据捕捉技术是什么?和ETL有什么不同?
一、什么是CDC技术? 变更数据捕获(Change Data Capture,简称 CDC)是一种用于识别和跟踪数据源中发生变化的数据的技术。 工作原理: 1.监测数据源:CDC 工具会持续监测指定的数据源,如数据库表、文件系统…...
一种用于推进欧洲临床中心中风管理的联邦学习平台即服务
论文标题:A Federated Learning Platform as a Service for Advancing Stroke Management in European Clinical Centers 作者信息: Diogo Reis Santos, Albert Sund Aillet, Antonio Boiano, Usevalad Milasheuski, Lorenzo Giusti, Marco Di Gennaro…...
给哔哩哔哩bilibili电脑版做个手机遥控器
前言 bilibili电脑版可以在电脑屏幕上观看bilibili视频。然而,电脑版的bilibili不能通过手机控制视频翻页和调节音量,这意味着观看视频时需要一直坐在电脑旁边。那么,有没有办法制作一个手机遥控器来控制bilibili电脑版呢? 首先…...
opencv dnn模块 示例(27) 目标检测 object_detection 之 yolov11
文章目录 1、YOLO v11 介绍1.1、改进点特性1.2、性能对比1.3、多任务支持 2、测试2.1、官方Python测试2.2、Opencv dnn测试2.3、测试统计 3、训练 1、YOLO v11 介绍 YOLO11是Ultralytics实时目标探测器系列中最新的迭代版本,重新定义尖端的精度、速度和效率。在以往…...
鸿蒙开发融云demo初始化和登录
鸿蒙开发融云IMKit初始化和登录 融云鸿蒙版是不带UI的,得自己一步步搭建。 下面说如何初始化和登录: 一、初始化: /*** desc : 初始化融云* author : congge on 2024-07-12 15:47**/public static initRongIm() {IMEngine.getInstance()…...
手机防窥膜的工作原理是怎样的?有必要使用防窥膜吗?
在信息高度发达的社会中,我们通过手机可以实现非常多的操作,同时手机中有存在许多我们的隐私信息,伴随使用手机的时间增多,手机中的信息也有可能被暴露,尤其是在公共场所旁人很容易通过瞥视你的手机屏幕获取到一些信息…...
【Python_PySide6学习笔记(三十九)】基于QLineEdit实现自定义文本框,用于格式化文本,每四个字符后添加一个空格
基于QLineEdit实现自定义文本框,用于格式化文本,每四个字符后添加一个空格 基于QLineEdit实现自定义文本框,用于格式化文本,每四个字符后添加一个空格前言1、实现要点1.1 继承和初始化1.2 定义textChanged的槽函数1.3 格式化逻辑1…...
23种设计模式口诀速记
设计模式的核心在于提供了相关问题的解决方案,使得人们可以更加简单方便的复用成功的设计和体系结构 23种设计模式,此处不举例,可以去看我上传的资源里面由详细汇总 口诀: 创建:想见员工丹 [抽象工厂、建造者(生成者…...
n > m 将输出文件 m 和 n 合并。 n < m 将输入文件 m 和 n 合并。 有什么区别
在你的描述中,似乎有一点误解。n >& m 和 n <& m 并不是用来合并文件的,而是用于重定向文件描述符(file descriptors)。让我澄清一下这两个命令的确切含义以及它们之间的区别。 n >& m —— 输出重定向 含…...
语言障碍在自闭症儿童中的表现及应对
自闭症儿童常常面临着语言障碍的困扰,这给他们的成长和发展带来了巨大挑战。 语言障碍在自闭症儿童中的表现形式多样。比如,有个叫小明的自闭症儿童,已经五岁了却还只会说一些简单的词语,如 “爸爸”“妈妈”“要” 等,…...
(成功解决)ubuntu22.04不小心更新成了atzlinux12.7.1,右上角出现红色错误符号
文章目录 🌕问题🌕查看系统版本🌕为什么更新更成了atzlinux🌕通过修复依赖关系尝试解决右上角红色错误符号🌕把源换成ubuntu的源🌕删除atzlinux源和自定义的第三方源🌕重新创建/etc/os-release文…...
005 C#语言基本元素概览,初识类型,变量与方法
构成C#语言的基本元素 标记 :C#编译器可以识别的文本 关键字(Keyword)操作符(Operator)标识符(Identifier)标点符号文本注释和空白 简要介绍数据据类型、变量与方法 变量是存放数据的地方,简称数据 方法是处理数据的逻辑,简称算法 程序…...
Spring Cloud --- Sentinel 授权规则
授权规则概述 在某些场景下,需要根据调用接口的来源判断是否允许执行本次请求。此时就可以使用 Sentinel 提供的授权规则来实现,Sentinel 的授权规则能够根据请求的来源判断是否允许本次请求通过。 在 Sentinel 的授权规则中,提供了 白名单…...
计算机网络基础 - 传输层(1)
计算机网络基础 传输层概述多路复用与解复用概述解复用的工作原理无连接多路解复用面向连接的多路复用 无连接运输:UDP概述UDP 主要应用UDP 报文段结构 可靠数据传输的原理概述构建可靠数据传输协议经完全可靠信道的可靠数据传输:rdt1.0经具有比特差错信…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...
DAY 45 超大力王爱学Python
来自超大力王的友情提示:在用tensordoard的时候一定一定要用绝对位置,例如:tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾: tensorboard的发展历史和原理tens…...
未授权访问事件频发,我们应当如何应对?
在当下,数据已成为企业和组织的核心资产,是推动业务发展、决策制定以及创新的关键驱动力。然而,未授权访问这一隐匿的安全威胁,正如同高悬的达摩克利斯之剑,时刻威胁着数据的安全,一旦触发,便可…...
