【Go语言基础【13】】函数、闭包、方法

发布时间:2026/11/3 1:24:48

【Go语言基础【13】】函数、闭包、方法 文章目录零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理二、函数类型与高阶函数1. 函数类型定义2. 高阶函数函数作为参数、返回值三、匿名函数与闭包1. 匿名函数Lambda函数2. 闭包Closure四、内置函数五、方法让go有了面向对象的特性零、概述函数核心特性速查特性说明多返回值支持同时返回结果和错误如(int, error)可变参数通过...Type定义本质为切片[]Type函数类型可定义函数类型如type FuncType func(int) bool闭包匿名函数捕获外部变量保持状态方法绑定到结构体的函数通过接收者参数func (t Type) Method()定义内置函数len、make、append等预定义函数直接使用最佳实践错误处理多返回值中优先返回错误如func() (Result, error)。使用if err ! nil判断错误避免忽略重要异常。减少值拷贝传递大结构体时使用指针*T避免性能损耗。切片、map等引用类型默认传递指针无需额外处理。函数职责单一每个函数专注完成一个独立功能符合单一职责原则。避免函数过长建议不超过50行复杂逻辑拆分为子函数。一、函数基础1、函数基础概念Go语言中的函数可赋值给变量、作为参数传递或作为返回值极大提升了编程灵活性。1. 函数定义语法func函数名(参数列表)(返回值列表){函数体return返回值}参数列表参数类型需后置连续相同类型可合并声明。funcsum(x,yint)int{// x, y 均为 int 类型returnxy}返回值列表可无返回值或多返回值用括号包裹支持命名返回值。funcdiv(x,yint)(int,error){// 多返回值ify0{return0,errors.New(除数不能为0)}returnx/y,nil}2、参数传递机制1.1. 值传递机制传递参数的副本函数内修改不影响原始值。适用场景小数据类型如int、string或无需修改原始值的场景。funcmodifyValue(xint){x100// 仅修改副本}funcmain(){a:20modifyValue(a)// a 仍为 20}1.2. 引用传递机制传递参数的地址通过指针*T函数内可修改原始值。适用场景大数据类型如结构体或需修改原始值的场景。funcmodifyPointer(x*int){*x100// 修改原始值}funcmain(){a:20modifyPointer(a)// a 变为 100}1.3. 可变参数语法通过...Type定义可变参数本质为切片。funcsum(nums...int)int{// nums 类型为 []inttotal:0for_,num:rangenums{totalnum}returntotal}funcmain(){sum(1,2,3)// 等价于 sum([]int{1,2,3})}3、返回值特性3.1. 多返回值用途同时返回结果和错误Go语言的惯用模式。funcreadFile(pathstring)([]byte,error){data,err:os.ReadFile(path)returndata,err}3.2. 命名返回值语法为返回值命名函数体可直接使用类似变量声明。funccalculate(x,yint)(sum,productint){// 命名返回值sumxy productx*yreturn// 隐式返回 sum, product}3.3. 错误处理丢弃返回值用_忽略不关心的返回值。data,_:readFile(data.txt)// 忽略错误二、函数类型与高阶函数1. 函数类型定义在Go语言中函数类型定义是指为一种特定的函数签名创建一个自定义类型名称。这样可以让具有相同签名的函数共享同一个类型有点面向接口开发的感觉。typeCalculatorfunc(int,int)int// 定义函数类型// 这些函数都符合Calculator类型的签名funcadd(x,yint)int{returnxy}funcsubtract(x,yint)int{returnx-y}funcmultiply(x,yint)int{returnx*y}funcdivide(x,yint)int{returnx/y}例题packagemainimportfmttypeCalculatorfunc(int,int)intfuncadd(x,yint)int{returnxy}funcsubtract(x,yint)int{returnx-y}// 使用函数类型作为参数funccalculate(calc Calculator,a,bint)int{returncalc(a,b)}// 使用函数类型作为变量funcmain(){varmyCalc Calculator myCalcadd fmt.Println(myCalc(5,3))// 输出: 8myCalcsubtract fmt.Println(myCalc(5,3))// 输出: 2// 作为参数传递result:calculate(add,10,5)fmt.Println(result)// 输出: 15}2. 高阶函数函数作为参数、返回值函数作为参数funcoperate(x,yint,fn Calculator)int{// 接收函数作为参数// 作为参数的函数来处理参数returnfn(x,y)}funcmain(){result:operate(10,5,add)// 调用 add 函数}函数作为返回值在Go语言中函数可以作为返回值这使得我们可以创建闭包。闭包是一个函数它可以捕获并记住其所在环境中的变量。funcmakeAdder(nint)Calculator{// 返回函数returnfunc(xint)int{returnxn}}funcmain(){add5:makeAdder(5)// add5(3) 返回 8}三、匿名函数与闭包1. 匿名函数Lambda函数无名称函数可直接定义和调用// 赋值给变量greet:func(){fmt.Println(Hello, Go!)}greet()// 调用匿名函数1.定义func(){...}是一个匿名函数因为它没有名称。2.赋值我们将这个匿名函数赋值给变量greet。3.调用通过greet()来调用这个匿名函数。// 立即执行函数表达式IIFEresult:func(x,yint)int{returnx*y}(3,4)1.定义并执行func(x,yint)int{returnx*y}是一个匿名函数。2.立即执行在定义后面紧跟(3,4)这表示立即用参数3和4调用这个函数。3.结果函数返回3*4的结果12并将其赋值给变量result。2. 闭包Closure定义匿名函数捕获外部变量形成闭包变量在闭包内保持状态。闭包能够捕获并记住其外部环境中的变量即使在函数执行完毕后这些变量仍然可以被访问和修改。这使得闭包可以在不同的调用之间保持状态例如计数器、缓存等。packagemainimportfmt// adder 返回一个闭包函数该函数捕获了外部变量 sumfuncadder()func(int)int{sum:0// 这是被闭包捕获的外部变量returnfunc(xint)int{sumx// 每次调用时更新并返回 sumreturnsum}}funcmain(){pos:adder()// 创建一个新的闭包fmt.Println(pos(1))// 输出: 1fmt.Println(pos(2))// 输出: 3fmt.Println(pos(3))// 输出: 6// 创建另一个独立的闭包neg:adder()fmt.Println(neg(-1))// 输出: -1fmt.Println(neg(-2))// 输出: -3}四、内置函数Go语言预定义了一组内置函数无需导入包即可使用函数名功能描述len()获取切片、字符串、通道等的长度new()分配零值内存返回指针如new(int)返回*intmake()创建引用类型切片、map、通道并初始化append()向切片追加元素返回新切片panic()触发运行时恐慌用于错误处理recover()在defer中恢复恐慌避免程序崩溃五、方法让go有了面向对象的特性在Go语言中方法和函数的主要区别在于方法是绑定到特定类型的而函数则是独立的。packagemainimport(fmtmath)typeCirclestruct{radiusfloat64}func(c Circle)area()float64{returnmath.Pi*c.radius*c.radius}func(c*Circle)updateRadius(rfloat64){c.radiusr}funccalculateArea(radiusfloat64)float64{returnmath.Pi*radius*radius}funcmain(){c:Circle{radius:5}// 调用方法fmt.Println(Area using method:,c.area())// 使用方法计算面积// 更新半径c.updateRadius(10)fmt.Println(Updated area using method:,c.area())// 调用函数fmt.Println(Area using function:,calculateArea(5))// 使用函数计算面积}通过方法Go语言实现了面向对象编程的特性使得类型可以拥有自己的行为。
延伸阅读

更多相关文章

2026/11/3 1:24:48

【Go语言基础【12】】指针:声明、取地址、解引用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:24:48

【Go语言基础【14】】defer与异常处理(panic、recover)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:24:48

PP-OCRv5_server_det_onnx开发者指南:如何扩展和定制文字检测功能

PP-OCRv5_server_det_onnx开发者指南:如何扩展和定制文字检测功能 PP-OCRv5_server_det_onnx是飞桨PaddlePaddle推出的高效文字检测工具,基于ONNX格式模型,专为服务端部署优化。本文将详细介绍如何扩展和定制其文字检测功能,帮助…

2026/11/3 2:24:51

folia-major 安装与首次跑通指南:30 分钟点亮全屏歌词动画

folia-major 安装与首次跑通指南:30 分钟点亮全屏歌词动画 【免费下载链接】folia-major 专注于绚丽的歌词动画效果的本地音乐/navidrome/第三方多平台在线音乐播放器 项目地址: https://gitcode.com/GitHub_Trending/fo/folia-major Folia(仓库名…

2026/11/3 2:24:51

5分钟装好网盘直链下载助手:8大网盘直链解析一步到位

5分钟装好网盘直链下载助手:8大网盘直链解析一步到位 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云…

2026/11/3 2:19:51

理解 GC Roots:对象为什么不能被回收

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

STM32实战:基于MAX14431数字隔离器的SPI隔离通信方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

工业SPI隔离通信设计:MAX14431BAEE+与STM32L4A6RG实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

STM32+NRF24L01无线抢答器:硬件设计、通信协议与低功耗实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑