快速入门GO语言之Lesson01-函数

本文深入讲解Go语言中的函数定义、使用、递归及匿名函数,包括函数的基本语法、参数传递、返回值处理、递归调用及匿名函数的应用实例。

一、GO语言函数定义

Go 语言最少有个 main() 函数。可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务。函数声明告诉了编译器函数的名称,返回类型,和参数。Go 语言标准库提供了多种可动用的内置的函数。

func function_name( [parameter list] ) [return_types] {
   函数体
}
func:函数由 func 开始声明
function_name:函数名称,函数名和参数列表一起构成了函数签名。
parameter list:参数列表,参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数。
return_types:返回类型,函数返回一列值。return_types 是该列值的数据类型。有些功能不需要返回值,这种情况下 return_types 不是必须的。
函数体:函数定义的代码集合。
From https://www.runoob.com/

二、带参与无参函数

2.1 函数定义

定义函数时,在函数后面()定义的参数叫做形参,参数传递只能由实参传递给形参,单向传递。

无参数无返回值函数
func MyFunc() {
	a := 10
	fmt.Printf("a = %d\n", a)
}
有参数无返回值函数
func MyFunc01(b int) {
	fmt.Printf("b = %d\n", b)
}
有参数无返回值函数
func MyFunc01(b int) {
	fmt.Printf("b = %d\n", b)
}

func MyFunc02(b, c int) {
	fmt.Printf("b = %d,c = %d\n", b, c)
}
不定参数列表
...int 不定参数类型
传递的实参可以是0或者多个
固定参数一定要传参数,固定参数可以不传
接收main()函数的
func MyFunc03(args ...int) {
	//获取用户参数传递的个数
	fmt.Printf("len(args) = %d\n", len(args))
	for i := 0; i < len(args); i++ {
		fmt.Printf("args[%d] = %d\n", i, args[i])
	}
	fmt.Printf("*****************\n")
	//返回两个值,第一个是下标,第二个是下标所对应的数
	for i, data := range args {
		fmt.Printf("args[%d] = %d\n", i, data)
	}
}

2.2 完整实践代码

package main

import "fmt"

// 1、函数定义声明
// Go 语言最少有个 main() 函数。
// 可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务。
// 函数声明告诉了编译器函数的名称,返回类型,和参数。
// Go 语言标准库提供了多种可动用的内置的函数。

//2、普通参数列表
//定义函数时,在函数后面()定义的参数叫做形参
//参数传递,只能由实参传递给形参,单向传递

//无参数无返回值函数
func MyFunc() {
	a := 10
	fmt.Printf("a = %d\n", a)
}

//有参数无返回值函数
func MyFunc01(b int) {
	fmt.Printf("b = %d\n", b)
}

func MyFunc02(b, c int) {
	fmt.Printf("b = %d,c = %d\n", b, c)
}

//3、不定参数列表
//...int 不定参数类型
//传递的实参可以是0或者多个
//固定参数一定要传参数,固定参数可以不传
//接收main()函数的
func MyFunc03(args ...int) {
	//获取用户参数传递的个数
	fmt.Printf("len(args) = %d\n", len(args))
	for i := 0; i < len(args); i++ {
		fmt.Printf("args[%d] = %d\n", i, args[i])
	}
	fmt.Printf("*****************\n")
	//返回两个值,第一个是下标,第二个是下标所对应的数
	for i, data := range args {
		fmt.Printf("args[%d] = %d\n", i, data)
	}
}

//接收Transform(args ...int)传过来的参数并打印
func MyFunc04(temp ...int) {
	for _, data := range temp {
		fmt.Printf("data = %d\n", data)
	}
}

//接收Transform(args ...int)传过来的参数并打印
func MyFunc05(temp ...int) {
	for _, data := range temp {
		fmt.Printf("data = %d\n", data)
	}
}

//传送参数到MyFunc04(temp ...int)和MyFunc05(temp ...int)
func Transform(args ...int) {
	//全部元素传递给MyFunc04()
	MyFunc04(args...)

	//[1到3]部分元素传递给MyFunc05()
	MyFunc05(args[1:3]...)
}

func main() {
	//调用MyFunc()函数
	MyFunc()
	//调用MyFunc01()函数
	MyFunc01(20)
	MyFunc02(30, 40)

	//调用MyFunc03()函数
	MyFunc03(1, 2, 3, 4, 5, 6, 7)

	//调用Transform() 函数
	Transform(1, 2, 3, 4, 5)
}
运行结果
a = 10
b = 20
b = 30,c = 40
len(args) = 7
args[0] = 1
args[1] = 2
args[2] = 3
args[3] = 4
args[4] = 5
args[5] = 6
args[6] = 7
*****************
args[0] = 1
args[1] = 2
args[2] = 3
args[3] = 4
args[4] = 5
args[5] = 6
args[6] = 7
data = 1
data = 2
data = 3
data = 4
data = 5
data = 2
data = 3

三、自定义函数

3.1 函数定义

函数声明包括函数名、形式参数列表、返回值列表(可省略)以及函数体。
无参有返回值:只有一个返回值。
有返回值的函数,需要通过return中断函数,通过return返回。
有参返回值,可以有多个返回值。

func 函数名(形式参数列表)(返回值列表){
    函数体
}

无参数无返回值函数
func MyFunc() {
	a := 10
	fmt.Printf("a = %d\n", a)
有参数无返回值函数
func MyFunc01(b int) {
	fmt.Printf("b = %d\n", b)
}
有参数无返回值函数
func MyFunc02(b, c int) {
	fmt.Printf("b = %d,c = %d\n", b, c)
}
返回一个int 10
func MyFunc06() int {
	return 10
}

给返回值起一个变量名
func MyFunc07() (result int) {
	return 10
}

返回多个参数
func MyFunc08() (a int, b int, c int) {
	a, b, c = 1, 2, 3
	return
}

3.2 完整实践代码

package main

import "fmt"

/* 1、函数定义声明
函数声明包括函数名、形式参数列表、返回值列表(可省略)以及函数体。
func 函数名(形式参数列表)(返回值列表){
    函数体
}*/

/*2、普通参数函数
定义函数时,在函数后面()定义的参数叫做形参
参数传递,只能由实参传递给形参,单向传递
*/

//无参数无返回值函数
func MyFunc() {
	a := 10
	fmt.Printf("a = %d\n", a)
}

//有参数无返回值函数
func MyFunc01(b int) {
	fmt.Printf("b = %d\n", b)
}

//有参数无返回值函数
func MyFunc02(b, c int) {
	fmt.Printf("b = %d,c = %d\n", b, c)
}

//接收main()传来的不定参数
func MyFunc03(args ...int) {
	//获取用户参数传递的个数
	fmt.Printf("len(args) = %d\n", len(args))
	for i := 0; i < len(args); i++ {
		fmt.Printf("args[%d] = %d\n", i, args[i])
	}
	fmt.Printf("*****************\n")
	//返回两个值,第一个是下标,第二个是下标所对应的数
	for i, data := range args {
		fmt.Printf("args[%d] = %d\n", i, data)
	}
}

//接收Transform(args ...int)传来的参数
func MyFunc04(temp ...int) {
	for _, data := range temp {
		fmt.Printf("data = %d\n", data)
	}
}

//接收Transform(args ...int)传来的参数
func MyFunc05(temp ...int) {
	for _, data := range temp {
		fmt.Printf("data = %d\n", data)
	}
}

//传递参数给MyFunc04(temp ...int)和MyFunc05(temp ...int)
func Transform(args ...int) {
	//全部元素传递给MyFunc04()
	MyFunc04(args...)
	//[1到3]部分元素传递给MyFunc05()
	MyFunc05(args[1:3]...)
}

/*3、返回值函数
无参有返回值:只有一个返回值
有返回值的函数,需要通过return中断函数,通过return返回
有参返回值,可以有多个返回值
*/

//返回一个int 10
func MyFunc06() int {
	return 10
}

//给返回值起一个变量名
func MyFunc07() (result int) {
	return 10
}

//返回多个参数
func MyFunc08() (a int, b int, c int) {
	a, b, c = 1, 2, 3
	return
}

func main() {
	//调用MyFunc()函数
	MyFunc()
	//调用MyFunc01()函数
	MyFunc01(20)
	MyFunc02(30, 40)
	fmt.Printf("*****************\n")
	//调用MyFunc03()函数
	MyFunc03(1, 2, 3, 4, 5, 6, 7)
	fmt.Printf("*****************\n")
	//调用Transform() 函数
	Transform(1, 2, 3, 4, 5)
	fmt.Printf("*****************\n")
	//调用MyFunc06()函数
	var a int
	a = MyFunc06()
	fmt.Printf("a = %d\n", a)
	fmt.Printf("*****************\n")
	//调用MyFunc07()函数
	fmt.Printf("result = %d\n", MyFunc07())
	fmt.Printf("*****************\n")
	//调用MyFunc08()函数
	d, e, f := MyFunc08()
	fmt.Printf("a = %d,b = %d,c = %d\n", d, e, f)
}

运行结果
a = 10
b = 20
b = 30,c = 40
*****************
len(args) = 7
args[0] = 1
args[1] = 2
args[2] = 3
args[3] = 4
args[4] = 5
args[5] = 6
args[6] = 7
*****************
args[0] = 1
args[1] = 2
args[2] = 3
args[3] = 4
args[4] = 5
args[5] = 6
args[6] = 7
*****************
data = 1
data = 2
data = 3
data = 4
data = 5
data = 2
data = 3
*****************
a = 10
*****************
result = 10

四、递归函数

4.1 递归函数的定义:通过调用自己实现递归。

4.2 普通函数与递归函数的调用过程对比(图片来自某视频教程)

递归函数实现递归调用
普通函数实现递归调用

4.3实践代码

package main

import "fmt"

func test(a int) {
	if a == 1 {
		fmt.Println("a = ", a)
		return //终止函数条用
	}
	test(a - 1) //调用函数本身
	fmt.Println("a = ", a)
}
func main() {
	test(3)
	fmt.Println("main")
}
运行结果
a =  1
a =  2
a =  3
main

五、匿名函数

5.1 匿名函数的定义

匿名函数没有函数名,只有函数体。函数可以作为一种类型被赋值给变量,匿名函数也往往以变量方式被传递。
匿名函数经常被用于实现回调函数和闭包等。

匿名函数,没有函数名字和函数定义以及调用
	f1 := func() {
		fmt.Println("a = ", a)
		fmt.Println("str = ", str)
	}
	f1() //执行函数

```go
定义匿名函数,同时调用
	func() {
		fmt.Printf("a = %d,str = %s\n", a, str)
	}() //后面的()代表调用此匿名函数
定义带参数的匿名函数,同时调用
	func(i, j int) {
		fmt.Printf("i = %d,j = %d\n", i, j)
	}(10, 20)
定义带两个参数的匿名函数,同时调用
	x, y := func(i, j int) (max, min int) {
		if i > j {
			max = i
			min = j

		} else {
			max = j
			min = i
		}

		return

	}(10, 20)
	fmt.Printf("x = %d,y = %d\n", x, y)

5.2 实践代码

package main

import "fmt"

func main() {
	a := 10
	str := "mike"
	//匿名函数,没有函数名字和函数定义以及调用
	f1 := func() {
		fmt.Println("a = ", a)
		fmt.Println("str = ", str)
	}
	f1() //执行函数

	//给一个函数起别名
	type funcType func() //函数没有参数,没有返回值
	//声明变量
	var f2 funcType
	f2 = f1
	f2()

	//定义匿名函数,同时调用
	func() {
		fmt.Printf("a = %d,str = %s\n", a, str)
	}() //后面的()代表调用此匿名函数

	//定义带参数的匿名函数,同时调用
	func(i, j int) {
		fmt.Printf("i = %d,j = %d\n", i, j)
	}(10, 20)

	//定义带两个参数的匿名函数,同时调用
	x, y := func(i, j int) (max, min int) {
		if i > j {
			max = i
			min = j

		} else {
			max = j
			min = i
		}

		return

	}(10, 20)
	fmt.Printf("x = %d,y = %d\n", x, y)
}

运行结果
a =  10
str =  mike
a =  10
str =  mike
a = 10,str = mike
i = 10,j = 20
x = 20,y = 10

内容概要:本文研究了基于DPWMA调制与正负序分离的ANPC三电平并网逆变器前馈控制策略,旨在解决传统三电平逆变器存在的谐波含量高、电网不平衡工况适应性差及动态响应速度不足等问题。通过采用有源中点箝位(ANPC)三电平逆变器拓扑,结合双极性倍频脉宽调制(DPWMA)、正负序分离锁相技术和电网电压前馈控制,构建了一套一体化的高性能并网控制体系。该体系不仅优化了逆变器的开关动作机制,改善了输出电压电流的谐波特性,而且通过精确的相位同步和扰动补偿,显著提高了系统的动态响应能力和抗扰性能。仿真结果显示,所提出的控制策略能有效降低并网谐波含量,提升锁相精度与系统动态稳定性,确保在复杂电网工况下的高质量稳定并网。 适合人群:具备一定电力电子基础知识和仿真技能的研发人员,尤其是从事新能源发电、储能系统、柔性输电等领域研究的专业人士。 使用场景及目标:①研究和开发高性能并网逆变器,特别是针对大功率、高电能质量要求的应用场景;②探索如何通过先进的调制和控制策略来提高并网逆变器对电网扰动的适应性和响应速度;③为相关领域的学术研究和技术开发提供理论依据和实践指导。 阅读建议:建议读者结合实际的仿真软件(如MATLAB/Simulink)进行实践操作,以便更好地理解和掌握文中提到的各种控制策略的具体实现方法。同时,鼓励读者关注最新的研究成果和发展趋势,不断深化对该领域的认识。
摘要 在全球生态环境问题日益严峻、公众环保参与意愿持续提升的背景下,传统环保志愿者招募与管理模式存在信息传播零散、供需对接不畅、管理效率低下等痛点,制约了环保公益事业的规模化发展。为解决上述问题,响应生态保护数字化发展需求,本课题设计实现“守望自然”环保志愿者招募与管理网站,通过数字化手段打通环保组织与志愿者的服务链路,对推动环保公益规范化、高效化发展具有重要的现实意义与实践价值。 该网站采用B/S架构与前后端分离模式开发,前端基于Vue架构建组件化响应式界面;后端以Java为开发语言,采用Spring Boot框架搭建应用,搭配MyBatis作为持久层框架,数据库选用MySQL并遵循第三范式设计7个以上核心数据表。系统涵盖用户与管理员两大核心角色,实现了闭环式环保志愿服务功能:用户端支持注册登录、个人信息管理、活动查询报名、环保知识学习、社区互动、问题反馈及客服咨询等功能,满足用户全流程参与需求;管理员端具备用户管理、用户审核、招募与活动信息发布管理、环保知识内容管理、问题反馈处理、证书模板管理、多维度数据可视化分析及社区内容监管等功能,全面支撑环保组织运营管理。开发过程中集成了Token身份认证、MD5密码加密、ECharts数据可视化等关键技术,融入活动智能推荐、数据驱动决策等创新设计,确保系统功能完备性与实用性。 经功能测试、性能测试及安全测试验证,系统运行稳定可靠,具有良好的易用性、安全性和可扩展性,能够高效满足环保组织的用户招募管理需求与用户的多元化参与需求,有效降低环保组织运营成本,提升用户参与体验,为环保理念传播与公益事业发展提供有力的数字化支撑。 关键词:环保志愿者;招募管理系统;Spring Boot;Vue;数据可视化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值