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

一、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

"sgmediation.zip" 是一个包含 UCLA(加利福尼亚大学洛杉矶分校)开发的 sgmediation 插件的压缩包。该插件专为统计分析软件 Stata 设计,用于进行中介效应分析。在社会科学、心理学、市场营销等领域,中介效应分析是一种关键的统计方法,它帮助研究人员探究变量之间的因果关系,尤其是中间变量如何影响因变量与自变量之间的关系。Stata 是一款广泛使用的统计分析软件,具备众多命令和用户编写的程序来拓展其功能,sgmediation 插件便是其中之一。它能让用户在 Stata 中轻松开展中介效应分析,无需编写复杂代码。 下载并解压 "sgmediation.zip" 后,需将解压得到的 "sgmediation" 文件移至 Stata 的 ado 目录结构中。ado(ado 目录并非“adolescent data organization”缩写,而是 Stata 的自定义命令存放目录)目录是 Stata 存放自定义命令的地方,应将文件放置于 "ado\base\s" 子目录下。这样,Stata 启动时会自动加载该目录下的所有 ado 文件,使 "sgmediation" 命令在 Stata 命令行中可用。 使用 sgmediation 插件的步骤如下:1. 安装插件:将解压后的 "sgmediation" 文件放入 Stata 的 ado 目录。如果 Stata 安装路径是 C:\Program Files\Stata\ado\base,则需将文件复制到 C:\Program Files\Stata\ado\base\s。2. 启动 Stata:打开 Stata,确保软件已更新至最新版本,以便识别新添加的 ado 文件。3. 加载插件:启动 Stata 后,在命令行输入 ado update sgmediation,以确保插件已加载并更新至最新版本。4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值