函数是基本的代码块,用于执行一个任务。Go 语言最少有 1 个 main() 函数。你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务。

函数声明告诉了编译器函数的名称、返回类型和参数。

函数三要素

  1. 名称 ==》功能
  2. 参数 ==》接口
  3. 返回值 ==》结果

函数分类

  1. 内置函数 ==》不需要引用其他模块,直接使用,例如:len()
  2. 标准库函数 ==》需要引用第三方模块或其他模块,带名称使用,例如:fmt.Println()
  3. 自定义函数 ==》程序员自行编写,自己调用

1、函数定义

Go 语言函数定义格式如下:

func function_name ( [parameter list] ) [return_types] {函数体
}

示例

func add (a, b int) int {return a + b
}

函数定义解析

  • func:函数由 func 开始声明
  • function_name:函数名称,函数名和参数列表一起构成了函数签名。注意:首字母大写表示公开函数,首字母小写是私有函数。
  • parameter list:参数列表,参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型、顺序及参数个数。参数是可选的,也就是说函数也可以不包含参数。
  • return_types:返回类型,函数返回一列值。return_types 是该列值的数据类型。有些功能不需要返回值,这种情况下 return_types 不是必须的。
  • 函数体:函数定义的代码集合。

实例

以下实例为 max() 函数的代码,该函数传入两个整型参数 num1 和 num2,并返回这两个参数的最大值:

/* 函数返回两个数的最大值 */
func max (num1, num2 int) int {/* 声明局部变量 */var result intif (num1 > num2) {result = num1} else {result = num2}return result 
}

2、函数调用

当创建函数时,你定义了函数需要做什么,通过调用该函数来执行指定任务。调用函数,向函数传递参数,并返回值,例如:

package main
import "fmt"func main() {/* 定义局部变量 */var a int = 100var b int = 200var ret int/* 调用函数并返回最大值 */ret = max(a, b) // a, b 实参fmt.Printf( "最大值是 : %d\n", ret )
}/* 函数返回两个数的最大值 */
// num1,num2 是形参
func max(num1, num2 int) int {/* 定义局部变量 */var result intif (num1 > num2) {result = num1} else {result = num2}return result 
}

以上实例在 main() 函数中调用 max() 函数,执行结果为:

最大值是 : 200

3、函数参数

函数如果使用参数,该变量可称为函数的形参。形参就像定义在函数体内的局部变量。

调用函数,可以通过两种方式来传递参数:

值传递

传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

默认情况下,Go 语言使用的是值传递,即在调用过程中不会影响到实际参数。

接下来,让我们使用值传递来调用 swap() 函数:

package main
import "fmt"func main() {/* 定义局部变量 */var a int = 100var b int = 200fmt.Printf("交换前 a 的值为 : %d\n", a )fmt.Printf("交换前 b 的值为 : %d\n", b )/* 通过调用函数来交换值 */swap(a, b) // 值传递,a ==》x,b ==》yfmt.Printf("交换后 a 的值 : %d\n", a )fmt.Printf("交换后 b 的值 : %d\n", b )
}/* 定义相互交换值的函数 */
func swap(x, y int) int {var temp inttemp = x /* 保存 x 的值 */x = y    /* 将 y 值赋给 x */y = temp /* 将 temp 值赋给 y*/return temp;
}

程序中使用的是值传递,所以两个值并没有实现交互,我们可以使用引用传递来实现交换效果。

引用传递

引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

引用传递指针参数传递到函数内,以下是交换函数 swap() 使用了引用传递:

以下我们通过使用引用传递来调用 swap() 函数:

package main
import "fmt"func main() {/* 定义局部变量 */var a int = 100var b int = 200fmt.Printf("交换前,a 的值 : %d\n", a )fmt.Printf("交换前,b 的值 : %d\n", b )/* 调用 swap() 函数* &a 指向 a 指针,a 变量的地址* &b 指向 b 指针,b 变量的地址*/swap(&a, &b) // 引用传递,&a ===》x,&b ===》yfmt.Printf("交换后,a 的值 : %d\n", a )fmt.Printf("交换后,b 的值 : %d\n", b )
}func swap(x *int, y *int) {var temp inttemp = *x /* 保存 x 地址上的值 */*x = *y   /* 将 y 值赋给 x */*y = temp /* 将 temp 值赋给 y */
}

4、函数返回多个值

Go 函数可以返回多个值,例如:

package main
import "fmt"func swap(x, y string) (string, string) {return y, x
}func main() {a, b := swap("Mahesh", "Kumar")fmt.Println(a, b)
}

以上实例执行结果为:

Kumar Mahesh

5、defer 语句

Go 语言中的 defer 语句会将其后面跟随的语句进行延迟处理。在 defer 所属的函数即将返回时,将延迟处理的语句按照 defer 定义的顺序逆序执行,即先进后出。

package main
import "fmt"func main() {fmt.Println("开始")defer fmt.Println(1)defer fmt.Println(2)defer fmt.Println(3)fmt.Println("结束")
}

以上代码执行结果如下:

开始
结束
3
2
1

6、init 函数

每一个源文件都可以包含一个 init 函数,该函数会在 main 函数执行前,被 Go 框架调用,也就是说 init() 函数会在 main() 函数之前执行。

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

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

相关文章

Ollama模型库模型下载慢完美解决(全平台)

前言在我们从ollama下载模型时,会发现ollama最开始下载速度很快,能达到10-20MB/s但到了后期,速度就会越来越慢,最终降低到10-20kb/s下载一个模型大多需要1到1.5小时这是因为ollama服务器负荷过大的问题思路如果在下载中终断下载,在用ollama run恢复下载,速度就会又提上去,但3-4…

web:js的模块导出/导入

一般web页面中&#xff0c;html文件通过标签script引用js文件。但是js文件之间的引用要通过import/exprot进行导入/导出&#xff0c;同时还要在html文件中对js文件的引用使用type属性标注。在下面的例子中&#xff0c;html页面<!DOCTYPE html> <html lang"en&quo…

关于Web前端安全防御之安全头配置

一、核心安全头的作用 1. X-Content-Type-Options: nosniff 该响应头用于阻止浏览器对资源的 MIME 类型进行 “嗅探”&#xff08;猜测&#xff09;&#xff0c;强制浏览器严格遵守服务器返回的 Content-Type 头部声明。 风险背景&#xff1a; 浏览器默认会对未明确声明类型…

C++ : 反向迭代器的模拟实现

一、reverse_iterator.h#pragma once namespace txf { //外界传什么类型的iteator&#xff0c;它就用什么iterator 初始化 , list用_list_iterator<T,T&,,T*> ,vector<T> 用T*template<class Iterator,class Ref,class Ptr>//在这个反向迭代器中涉及到…

自动化与配置管理工具 ——SaltStack

一、SaltStack 概述1.1 核心特性SaltStack 是一款开源的自动化运维工具&#xff0c;采用客户端 - 服务器&#xff08;C/S&#xff09;架构&#xff0c;以高效、灵活和可扩展著称。其核心特性包括&#xff1a;高性能架构&#xff1a;基于 ZeroMQ 消息队列&#xff0c;支持大规模…

Rust → WebAssembly 的性能剖析全指南

一、用优化&#xff08;Release&#xff09;构建 ⚡ 务必在做性能测量前使用 优化模式 构建你的 WASM。默认情况下&#xff1a; wasm-pack build → Release 优化wasm-pack build --dev 或 cargo build → Debug&#xff0c;性能大打折扣 优化编译能开启 LLVM 的各项优化和 LT…

第15届蓝桥杯Pthon青少组_国赛_中/高级组_2024年9月7日真题

更多内容请查看网站&#xff1a;【试卷中心 -----> 蓝桥杯----> Python----> 国赛】 网站链接 青少年软件编程历年真题模拟题实时更新 第15届蓝桥杯Pthon青少组_国赛_中/高级组_2024年9月7日真题 一、单选题 第 1 题 单选题 下列运算符中&#xff0c;表示并集的…

【Django】-9- 单元测试和集成测试(上)

一、Django 项目单元 & 集成测试准备 &#x1f447;依赖安装&#xff08;给项目装 “测试小帮手”&#x1f37c;&#xff09;pdm add -d black isort flake8 pytest pytest-django pytest-coverage &#x1f449; 这行命令像在给项目 “采购” 测试工具&#xff1a;black …

VUE-第二季-01

目录 1.Vue程序初体验 1.1 下载并安装vue.js 1.2 第一个Vue程序 1.3 Vue的data配置项 1.4 Vue的template配置项 1.5 Vue实例 和 容器 的关系是&#xff1a;一夫一妻制 2.Vue核心技术 2.0 Vue的模板语法 2.0.1 插值语法 插值语法总结&#xff1a; 2.0.2 指令语法 指…

Android 15 中禁用/启用应用的系统级方法

在 Android 15 的开发中,有时我们需要以系统级权限来控制应用的启用状态。本文将介绍如何使用 PackageManager 来实现应用的禁用和启用功能。 核心方法 在 Android 15 代码中,可以使用以下方法来禁用或启用应用: packageManager.setApplicationEnabledSetting(pkg,Packag…

2025网络工程师技能图谱(附思维导图)

------------比较全面&#xff0c;供学习参考路线图。-----------------------

【ROS2】rclcpp::Node 常用 API

ROS 系列学习教程(总目录) ROS2 系列学习教程(总目录) 目录1. 构造函数2. 节点名称相关3. 获取log对象句柄4. 回调组相关5. Topic发布与订阅6. Service服务端与客户端1. 构造函数 public:Node(const std::string & node_name, const NodeOptions & options NodeOptio…

自动驾驶:技术、应用与未来展望——从开创到全面革新交通出行

一、引言1.1 研究背景与意义在过去的几十年里&#xff0c;随着科技的飞速发展&#xff0c;自动驾驶技术逐渐从科幻小说中的概念走进了现实生活。从最初简单的辅助驾驶功能&#xff0c;到如今高度自动化的自动驾驶系统&#xff0c;这一领域的进步正深刻地改变着我们的出行方式和…

【gradle】插件那些事

文章目录 1. 前言 2. 插件相关介绍 2.1 gradle插件的apply 2.2 引入自定义插件 2.3 常见构建任务 2.4 gradle生命周期 2.5 gradle的惰性属性&可注入的服务 2.6 常见命令 检查依赖树 查看tasks 构建扫描 查看多项目构建的结构 显示所选项目的构建脚本依赖项 指定控制台模式来…

测试平台如何重塑CI/CD流程中的质量协作新范式

测试平台如何重塑CI/CD流程中的质量协作新范式 在DevOps革命席卷全球软件行业的今天&#xff0c;测试的角色正在经历前所未有的转变。传统的"测试最后"模式正在被"测试全程"的新理念所取代&#xff0c;这一转变背后是测试平台与CI/CD流程深度融合带来的质量…

node.js不同环境安装配置

node.js不同环境安装配置 Windows环境安装配置 一、Node.js是什么&#xff1f; ​ Node.js是一个基于Chrome V8引擎的[JavaScript运行环境]。 Node.js使用了一个事件驱动、非阻塞式I/O 的模型&#xff0c;Node.js是一个让JavaScript运行在服务端的开发平台&#xff0c;它让J…

深度学习-读写模型网络文件

模型网络文件是深度学习模型的存储形式&#xff0c;保存了模型的架构、参数等信息。读写模型网络文件是深度学习流程中的关键环节&#xff0c;方便模型的训练、测试、部署与共享。1. 主流框架读写方法&#xff08;一&#xff09;TensorFlow保存模型可以使用 tf.saved_model.sav…

智慧能源管理平台的多层协同控制架构研究

摘要&#xff1a;针对微电网多源异构设备协同难题&#xff0c;提出一种“云-边-端”三层智慧能源管理架构。平台集成数据采集、策略优化与全景分析功能&#xff0c;支持光伏、储能、充电桩等设备的动态调度&#xff0c;通过自适应算法实现防逆流、需量控制及峰谷套利等策略组合…

MySQL面试题及详细答案 155道(021-040)

《前后端面试题》专栏集合了前后端各个知识模块的面试题&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

2025年IntelliJ IDEA最新下载、安装教程,附详细图文

文章目录下载与安装IDEA大家好&#xff0c;今天为大家带来的是IntelliJ IDEA的下载、安装教程&#xff0c;亲测可用&#xff0c;喜欢的朋友可以点赞收藏哦下载与安装IDEA 首先先到官网下载最新版的IntelliJ IDEA, 下载后傻瓜式安装就好了 1、下载完后在本地找到该文件&#xf…