Go05-函数与方法
第4章函数与方法4.1 函数基础函数声明// 基本语法func函数名(参数列表)返回值列表{// 函数体}// 示例funcadd(aint,bint)int{returnab}// 简写参数类型相同类型funcadd(a,bint)int{returnab}多返回值// Go 函数支持多返回值funcdivide(a,bfloat64)(float64,error){ifb0{return0,errors.New(除数不能为零)}returna/b,nil}// 使用result,err:divide(10,3)iferr!nil{fmt.Println(错误:,err)}else{fmt.Println(结果:,result)}命名返回值// 命名返回值相当于在函数内部声明变量funcswap(a,bint)(x,yint){xb yareturn// 裸返回自动返回命名返回值}// 使用x,y:swap(1,2)fmt.Println(x,y)// 输出2 14.2 函数作为值Go 中函数是一等公民可以赋值给变量、作为参数传递// 函数作为变量add:func(a,bint)int{returnab}fmt.Println(add(1,2))// 输出3// 函数作为参数funcapply(a,bint,operationfunc(int,int)int)int{returnoperation(a,b)}result:apply(10,5,func(a,bint)int{returna-b})fmt.Println(result)// 输出5// 函数作为返回值funccreateMultiplier(factorint)func(int)int{returnfunc(xint)int{returnx*factor}}double:createMultiplier(2)fmt.Println(double(5))// 输出104.3 闭包闭包是引用了外部变量的函数// 闭包示例计数器funccounter()func()int{count:0returnfunc()int{countreturncount}}c:counter()fmt.Println(c())// 1fmt.Println(c())// 2fmt.Println(c())// 3// 闭包示例函数工厂funcgreet(prefixstring)func(string)string{returnfunc(namestring)string{returnprefix, name!}}hello:greet(你好)goodbye:greet(再见)fmt.Println(hello(张三))// 你好, 张三!fmt.Println(goodbye(李四))// 再见, 李四!4.4 可变参数// 可变参数函数funcsum(nums...int)int{total:0for_,n:rangenums{totaln}returntotal}fmt.Println(sum(1,2,3))// 6fmt.Println(sum(1,2,3,4,5))// 15// 切片作为可变参数numbers:[]int{1,2,3,4,5}fmt.Println(sum(numbers...))// 154.5 方法方法是带有接收者的函数// 定义结构体typeRectanglestruct{Width,Heightfloat64}// 值接收者方法func(r Rectangle)Area()float64{returnr.Width*r.Height}// 指针接收者方法可以修改接收者func(r*Rectangle)Scale(factorfloat64){r.Width*factor r.Height*factor}// 使用rect:Rectangle{Width:10,Height:5}fmt.Println(面积:,rect.Area())// 50rect.Scale(2)fmt.Println(缩放后面积:,rect.Area())// 200值接收者 vs 指针接收者typeCounterstruct{Valueint}// 值接收者操作副本不影响原值func(c Counter)Increment(){c.Value// 修改的是副本}// 指针接收者操作原值func(c*Counter)Increment(){c.Value// 修改的是原值}// 选择原则// 1. 如果需要修改接收者使用指针接收者// 2. 如果接收者是大型结构体使用指针接收者避免复制// 3. 一致性同一类型的方法应使用相同的接收者类型4.6 内置函数Go 提供了一些内置函数// len - 获取长度s:Hellofmt.Println(len(s))// 5// cap - 获取容量slice:make([]int,5,10)fmt.Println(cap(slice))// 10// make - 创建切片、map、channelslice:make([]int,5)// 长度为5的切片m:make(map[string]int)// 空mapch:make(chanint,100)// 带缓冲的channel// new - 分配内存返回指针p:new(int)// *int 类型*p42fmt.Println(*p)// 42// copy - 复制切片src:[]int{1,2,3}dst:make([]int,len(src))copy(dst,src)// delete - 删除map元素m:map[string]int{a:1,b:2}delete(m,a)// panic - 触发恐慌// recover - 捕获恐慌4.7 练习编写函数计算斐波那契数列实现一个函数工厂根据参数返回不同的排序函数使用闭包实现一个简单的缓存为自定义类型实现 Stringer 接口4.8 下一章下一章我们将学习 Go 语言的数组、切片与 Map。

相关新闻

Go04-控制结构

Go04-控制结构

第3章:控制结构 3.1 条件语句 if 语句 // 基本语法(不需要括号) if age > 18 {fmt.Println("成年人") }// 条件语句可以包含初始化语句 if score : getScore(); score > 90 {fmt.Println("优秀") } else if sco…

2026/7/16 22:59:41 阅读更多 →
硬件工程师八大细分岗位解析:从模拟设计到系统架构的职业选择

硬件工程师八大细分岗位解析:从模拟设计到系统架构的职业选择

作为一名硬件工程师,你是否曾经在职业发展道路上感到迷茫?面对众多岗位方向,不知道哪个最适合自己?或者刚入行时以为硬件工程师就是画板子、调电路,工作几年后才发现这个领域细分之深、方向之多远超想象? …

2026/7/16 22:57:41 阅读更多 →
HBase集群启动异常排查:HMaster进程缺失的深度诊断与修复

HBase集群启动异常排查:HMaster进程缺失的深度诊断与修复

1. HMaster进程缺失的典型表现与初步诊断当你启动HBase集群时发现Web UI的16010端口无法访问,或者通过jps命令查看不到HMaster进程,但RegionServer却正常运行,这就是典型的HMaster缺失场景。我遇到过最棘手的情况是集群所有服务"看起来&…

2026/7/16 22:55:39 阅读更多 →

最新新闻

终极指南:如何判断guided-diffusion扩散模型训练是否收敛

终极指南:如何判断guided-diffusion扩散模型训练是否收敛

终极指南:如何判断guided-diffusion扩散模型训练是否收敛 【免费下载链接】guided-diffusion 项目地址: https://gitcode.com/gh_mirrors/gu/guided-diffusion 你是否曾经花费数天时间训练扩散模型,却不知道何时该停止?想象一下&…

2026/7/16 23:41:56 阅读更多 →
IFC++:C++开源库实现BIM数据处理与可视化开发指南

IFC++:C++开源库实现BIM数据处理与可视化开发指南

1. 项目概述:IFC是什么,以及为什么你需要它如果你正在建筑、工程或施工(AEC)领域工作,或者对建筑信息模型(BIM)的数据处理感兴趣,那么你很可能听说过IFC文件。IFC,全称工…

2026/7/16 23:39:56 阅读更多 →
C++ Builder XE10演示项目:从RAD开发到多线程实战全解析

C++ Builder XE10演示项目:从RAD开发到多线程实战全解析

1. 项目概述:为什么需要一个“演示项目”?如果你是一位刚从Visual Studio或者Qt Creator转战到C Builder XE10的开发者,或者你是一位想快速评估这个IDE是否适合团队新项目的技术负责人,那么你很可能和我当初一样,面对一…

2026/7/16 23:37:55 阅读更多 →
Quartus Prime IP核授权破解:从特征码识别到License文件定制

Quartus Prime IP核授权破解:从特征码识别到License文件定制

1. Quartus Prime IP核授权机制解析在FPGA开发领域,IP核就像是现成的乐高积木块,能让我们快速搭建复杂系统。Altera(现Intel PSG)提供的IP核分为两大类:基础功能IP和高级功能IP。基础IP包括PLL、存储器控制器这些"…

2026/7/16 23:35:54 阅读更多 →
Spring Boot多模块打包进阶:剖析spring-boot-maven-plugin的依赖陷阱与双包策略

Spring Boot多模块打包进阶:剖析spring-boot-maven-plugin的依赖陷阱与双包策略

1. Spring Boot多模块项目中的依赖陷阱在Spring Boot多模块项目中,我们经常会遇到一个令人头疼的问题:当基础模块被打包后,其他依赖它的模块在编译或运行时却报"Class Not Found"或"Package does not exist"错误。这个问…

2026/7/16 23:35:54 阅读更多 →
ACE-Step UI:开源AI音乐创作引擎,释放无限创作潜能

ACE-Step UI:开源AI音乐创作引擎,释放无限创作潜能

ACE-Step UI:开源AI音乐创作引擎,释放无限创作潜能 【免费下载链接】ace-step-ui 🎵 The Ultimate Open Source Suno Alternative - Professional UI for ACE-Step 1.5 AI Music Generation. Free, local, unlimited. Stop paying for Suno! …

2026/7/16 23:33:53 阅读更多 →

日新闻

HarmonyOs应用《重要日》开发第6篇 - 数据持久化存储

HarmonyOs应用《重要日》开发第6篇 - 数据持久化存储

本篇深入剖析 ImportantDays 项目的数据持久化方案——基于 HarmonyOS ArkData 模块的 Preferences 轻量级存储,以及 PreferenceUtil 工具类的单例封装。一、HarmonyOS 数据存储方案对比 HarmonyOS 提供了多种数据存储方案:方案适用场景特点Preferences轻…

2026/7/16 0:08:27 阅读更多 →
Python实现跨境电商商品图批量翻译教程

Python实现跨境电商商品图批量翻译教程

一、问题引入做跨境电商的卖家朋友,你是否遇到过这样的困扰?每次上架新品到亚马逊、Shopee或Lazada等平台,都需要处理大量商品图片的多语言版本。比如上架200款衣服,每款需要翻译成英语、日语、韩语等5种语言,这意味着…

2026/7/16 0:08:27 阅读更多 →
鸿蒙 7 新特性实战①:从 0 到 1 掌握 @kit 标准导入规范

鸿蒙 7 新特性实战①:从 0 到 1 掌握 @kit 标准导入规范

从鸿蒙 7(HarmonyOS NEXT)开始,官方全面完成了从 ohos.* 零散模块到 kit.* 领域套件的体系重构。对开发者来说,第一道门槛不是 API 用法变化,而是统一的导入规范——旧体系默认导入、解构导入混用的混乱局面被彻底终结…

2026/7/16 0:10:29 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/15 21:09:01 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/15 19:42:20 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/16 23:40:37 阅读更多 →

月新闻