news 2026/4/23 14:32:21

Golang基础语法(go语言函数)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Golang基础语法(go语言函数)

文章目录

  • 函数定义
  • 函数调用
  • 参数传递
  • 函数用法
    • 函数变量
    • 函数闭包
      • 修改代码加深印象
      • 执行顺序例子

同其他语言一样,go语言也有函数的概念,主要是为了代码复用,函数是基本的代码块,用于执行一个任务。

Go 语言最少有个 main() 函数,同时main函数也是整个程序执行的入口。

函数定义

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

funcfunction_name([parameter list])[return_types]{// 函数体}
  • func:函数关键字,任何一个函数都有func关键字开始声明。
  • function_name:函数名称,参数列表和返回值类型构成了函数签名。
  • parameter list:参数列表,参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数。
  • return_types:返回类型,函数返回一列值。return_types 是该列值的数据类型。有些功能不需要返回值,这种情况下 return_types 不是必须的。
  • 函数体:函数定义的代码集合。
  • 注意:go语言函数区别于c++和java语言的地方是可以有多个返回值,多个返回值用小括号括起来,中间用逗号分隔。

代码展示:

packagemainimport"fmt"funcswap(x,ystring)(string,string){returny,x}funcmain(){a,b:=swap("Google","Hello")fmt.Println(a,b)}

运行结果:

Hello Google

函数调用

当创建函数时,你定义了函数需要做什么,通过调用该函数来执行指定任务。

调用函数,向函数传递参数,并返回值,例如:

packagemainimport"fmt"funcmain(){/* 定义局部变量 */varaint=100varbint=200varretint/* 调用函数并返回最大值 */ret=max(a,b)fmt.Printf("最大值是:%d\n",ret)}/* 函数定义:返回两个数的最大值 */funcmax(num1,num2int)int{/* 定义局部变量 */varresultintifnum1>num2{result=num1}else{result=num2}returnresult}

运行结果:

最大值是:200

参数传递

在golang中函数的参数传递都是值传递,不存在引用传递(区别于c++)

注意:使用值传递的时候,虽然会改变形参的值,但并不会改变函数外变量即实参的值。

代码展示:

packagemainimport"fmt"funcmain(){/* 定义局部变量 */varaint=100fmt.Printf("自增前 a 的值为:%d\n",a)add(a)fmt.Printf("自增后 a 的值:%d\n",a)}/* 函数定义:自增1 */funcadd(aint){a++;fmt.Printf("add里a的值:%d\n",a)}

运行结果:

自增前 a 的值为:100 add里a的值:101 自增后 a 的值:100

函数用法

函数变量

一切皆变量,go语言里什么都可以当作变量来使用,当然函数也不例外,函数可以作为函数变量。
Go 语言可以很灵活的创建函数,并作为另一个函数的实参。以下实例中我们在定义的函数中初始化一个变量,该函数仅仅是为了使用内置函数

代码展示:

packagemainimport("fmt""math")funcmain(){/* 声明函数变量 */getSquareRoot:=func(xfloat64)float64{returnmath.Sqrt(x)// 求一个数的平方根}/* 使用函数变量调用函数 */fmt.Println(getSquareRoot(9))}

运行结果:

3

再举一个用函数变量作回调函数的例子:

packagemainimport"fmt"// 声明一个函数类型typefcfunc(int)intfuncmain(){CallBack(1,callBack)//执行函数--CallBack}funcCallBack(xint,f fc){//定义了一个函数 testCallBackf(x)//由于传进来的是callBack函数,该函数执行需要传入一个int类型参数,因此传入x}funccallBack(xint)int{fmt.Printf("我是回调,x:%d\n",x)returnx}

运行结果:

我是回调,x:1

函数闭包

所谓闭包,就是匿名函数,go语言支持匿名函数调用。匿名函数就是一个“内联”语句或表达式。
匿名函数的优越性在于可以直接使用函数内的变量,不必声明,这样有时候可以使代码更简单,增强代码的可读性

代码展示:

packagemainimport"fmt"funcgetNumber()func()int{i:=0returnfunc()int{i+=1returni}}funcmain(){/* nextNumber 为一个函数,函数中 i 为 0 */nextNumber:=getNumber()/* 调用 nextNumber 函数,i 变量自增 1 并返回 */fmt.Println(nextNumber())fmt.Println(nextNumber())fmt.Println(nextNumber())/* 创建新的函数 nextNumber1,并查看结果 */nextNumber1:=getNumber()fmt.Println(nextNumber1())fmt.Println(nextNumber1())}

运行结果:

12312

注意:多次调用同一个函数nextNumber,其中的变量是同一个,初始值为0,每调用一次,自增1。

下面补充解释一下上面代码为什么会出现这样的结果:

首先,getNumer这个函数会返回一个闭包函数,我们先理解闭包是啥,闭包就是等于 匿名函数+捕获的变量,我们可以看到第7行-第10行,闭包函数里面捕获了变量,因为i不是在闭包函数里面定义的,

15行代码,通过getNumber获取了一个闭包函数 —nextNumber

18,19,20行分别执行一次nextNumber函数,每次就会自增1,并且因为每次调用都是固定的,结果会累计,所以会输出1,2,3

23行重新获取了一个闭包函数,是独立于上面闭包函数的,所以重新输出1,2,3

同一个闭包会引用同一个变量,因此这里的i会递增。

修改代码加深印象

packagemainimport"fmt"funcgetNumber()func()int{i:=0fmt.Printf("getNumber中i的地址%v\n",&i)returnfunc()int{i+=1fmt.Printf("闭包里i的地址%v\n",&i)returni}}funcmain(){/* nextNumber 为一个函数,函数中 i 为 0 */nextNumber:=getNumber()/* 调用 nextNumber 函数,i 变量自增 1 并返回 */fmt.Println(nextNumber())fmt.Println(nextNumber())fmt.Println(nextNumber())/* 创建新的函数 nextNumber1,并查看结果 */nextNumber1:=getNumber()fmt.Println(nextNumber1())fmt.Println(nextNumber1())}
root@GoLang:~/proj/goforjob# go run main.gogetNumber中i的地址0xc000012098 闭包里i的地址0xc0000120981闭包里i的地址0xc0000120982闭包里i的地址0xc0000120983getNumber中i的地址0xc000102000 闭包里i的地址0xc0001020001闭包里i的地址0xc0001020002

执行顺序例子

packagemainimport"fmt"func铁扇公主()func()string{法宝:="芭蕉扇"returnfunc()string{fmt.Println("🐵:宝宝肚肚打雷了")return法宝}}funcmain(){something:=铁扇公主()fmt.Printf("猴哥拿到了 %v! \n",something())}
root@GoLang:~/proj/goforjob# go run main.go🐵:宝宝肚肚打雷了 猴哥拿到了 芭蕉扇!root@GoLang:~/proj/goforjob#

之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 5:30:44

周MACD叠加主图 指标源码

{}RC:DYNAINFO(3)*1.1; DK:"MACD.MACD"(60,130,45)*2; 控盘:DK; STICKLINE(控盘<0 AND 控盘<REF(控盘,1),控盘RC,RC,0.05,0),COLORLIBLUE; STICKLINE(控盘<0 AND 控盘>REF(控盘,1),控盘RC,RC,0.05,0),COLORWHITE; STICKLINE(控盘>REF(控盘,1) AND 控盘…

作者头像 李华
网站建设 2026/4/23 5:30:52

基于M2FP的AR购物体验:虚拟试穿技术实现

基于M2FP的AR购物体验&#xff1a;虚拟试穿技术实现 在增强现实&#xff08;AR&#xff09;与智能零售深度融合的今天&#xff0c;虚拟试穿已成为提升用户转化率和购物沉浸感的关键技术。然而&#xff0c;传统方案在多人场景、遮挡处理和边缘精度上常表现不佳。本文将深入探讨如…

作者头像 李华
网站建设 2026/4/23 5:30:53

私募无敌指标 副图 通达信 贴图修正导入密码重发

{}{私暮无敌} VAR1:MA(LOW,24)*1.09; VAR2:MA(LOW,24)*1.19; VAR3:COUNT(CROSS(CLOSE,VAR1),2)1 OR CROSS(CLOSE,VAR2); VAR4:REF(COUNT(CLOSE/OPEN<0.963,7)<2 AND CLOSE/OPEN>0.94,1); VAR5:EMA(SLOPE(CLOSE,13)*13CLOSE,13); VAR6:HHV(VAR5,26); VAR7:EMA(SLOPE(CL…

作者头像 李华
网站建设 2026/4/23 5:30:52

Windows服务化部署:将M2FP注册为后台系统服务

Windows服务化部署&#xff1a;将M2FP注册为后台系统服务 &#x1f4d6; 项目背景与核心价值 在实际生产环境中&#xff0c;许多AI模型以脚本或本地Web服务的形式运行&#xff0c;依赖人工启动和持续保持终端开启&#xff0c;这不仅影响稳定性&#xff0c;也难以实现自动化运…

作者头像 李华
网站建设 2026/4/18 22:06:14

M2FP模型API性能优化:高并发处理解决方案

M2FP模型API性能优化&#xff1a;高并发处理解决方案 &#x1f4cc; 背景与挑战&#xff1a;从单请求到高并发的演进需求 随着计算机视觉技术在内容创作、虚拟试衣、智能安防等领域的广泛应用&#xff0c;多人人体解析服务正逐步成为图像理解的核心能力之一。M2FP&#xff08;M…

作者头像 李华
网站建设 2026/4/18 2:38:08

开发者必备:5个高可用开源翻译工具,这款CPU适配最稳

开发者必备&#xff1a;5个高可用开源翻译工具&#xff0c;这款CPU适配最稳 在AI驱动的全球化开发浪潮中&#xff0c;高质量、低延迟、易集成的中英翻译能力已成为开发者构建多语言应用的核心需求。无论是国际化产品界面、技术文档本地化&#xff0c;还是跨语言API通信&#x…

作者头像 李华