Go,你也可以的!-【5.1 函数】

5.1 函数

函数可以说是各个编程语言都具备的东西,而在使用方面也是大同小异。

函数在我们的实际应用中是必须的一个东西,可以说是我们程序的重要组成部分。

本节将对函数进行详细讲解。

本节代码存放目录为 lesson13

什么是函数?

在我们之前的章节例子中,代码里面都会有func main(),这就是一个主函数,在我们的程序中有且只能有一个。

我们之前的代码都写在了main里面,那么如果我们的代码特别多的时候,这样显然是不行的。

一方面这样代码会写的很乱,一方面也不能达到我们的要求。

所以我们一般会将一些代码单独拿出来作为一部分,那么拿出来的这一部分我们就会单独写一个func放进去。

这就是函数的简单理解。

函数定义

函数定义的规则是固定的,通过func关键字进行声明。如下所示:

func printHello() {
	fmt.Println("Hello!")
}

在上面的代码中,我们定义了一个函数,专门用于打印输出固定的字符串。

func是一个固定的关键字,在声明函数的时候是必备的。

printHello表示函数名称,在Go语言中,同一个包下的函数名称必须是唯一的,这与其他语言有一些不同。

()表示函数的参数,接下来我们会讲到。

{}里面的就是函数体,这也是函数必备的内容。

那么我们应该如何调用呢?如下代码所示:

func main() {
	printHello()
}

在上面的代码中,我们直接在main函数中调用了printHello函数,这样就实现了函数的调用。

结果输出如下:

Hello!

函数传参及返回值

刚刚我们讲到了函数简单的定义及调用,同时我们讲到了()是作为函数传参的。

那么这是什么东西呢?在我们实际开发过程中,我们可能会有一些复杂的函数,比如说我们需要将打印的数据传进去,而不是固定的。

那么这种情况下我们就会需要使用到函数参数。如下代码所示:

func print(text string) {
	fmt.Println(text)
}

在上面的代码中,我们可以看到,我们增加了一个text参数,之后在函数体内进行了使用。

在调用方面,我们则可以这样:

print("我的参数内容")

结果输出如下:

我的参数内容

同样的,如果我们需要传递多个参数,那么我们可以这样:

func print1(text string, text2 string) {
	fmt.Println(text)
	fmt.Println(text2)
}

也可以简写为这样:

func print1(text, text2 string) {
	fmt.Println(text)
	fmt.Println(text2)
}

有的时候,我们需要在函数调用后得到一些值。

比如这个函数的作用是计算两个数字的和,那么计算后我们需要得到最终的结果。

所以这时候我们需要函数将值返回给我们。我们可以这样做:

func sum(a, b int) int {
	return a + b
}

在调用的时候,我们需要接收这个返回值,我们可以这样做:

sumResult := sum(1, 2)
fmt.Println(sumResult)

在上面的代码中,我们在调用时传入了两个参数:12

其中1就表示第一个参数,2表示第二个参数。

之后我们使用sumResult来接收了函数计算的返回值。

我们还可以将上面的函数进行简写,如下所示:

func sum2(a, b int) (s int) {
	s = a + b
	return
}

在上面的代码中,我们在函数返回的地方直接定义了:(s int),这就表示已经将返回值声明为了s,那么在底部只需要直接return就可以了。

关于函数传参,还有一个比较特殊的地方,那就是Go语言允许可变参

也就是说同一个类型,可以传递一个参数,也可以传递多个参数,如下所示:

func sum3(number ...int) (s int) {
	for _, n := range number {
		s += n
	}
	return
}

在上面的代码中,我们通过...将参数作为了一个可变参,可以传递一个参数进来,也可以传递很多个参数进来。

需要注意的是,一个函数只允许定一个可变参

调用方式如下所示,分别演示了传递一个参数与多个参数的调用方式:

fmt.Println(sum3(1))
fmt.Println(sum3(1, 2, 3))

函数作为参数

Go语言中,允许我们将一个函数作为另一个函数的参数传入。如下所示:

func funcParam(fn func(a, b int) int) int {
	a := 1
	b := 1
	return fn(a, b)
}

在上面的代码中,我们定义了一个函数为funxParam,同时将函数的参数定义为了一个函数。

函数接收两个int类型的参数,返回一个int类型的参数,在funcParam中,我们直接使用fn即可。

调用方式如下所示:

fmt.Println(funcParam(sum))

在上面的代码中,我们直接调用了funcParam,同时将我们之前定义的sum函数传递了进去。

需要注意的是,传入的函数参数、返回值,都需要与funcParam定义的一致。

结果输出如下:

2

闭包

Go语言中,我们可以通过匿名函数作为闭包使用。实现方式如下所示:

sumFunc := func(a, b int) int {
	return a + b
}
fmt.Println(sumFunc(1, 2))
fmt.Println(sumFunc(3, 4))

在上面的代码中,我们直接在main中定义了一个求和函数,将其赋值给了变量sumFunc

在调用的时候,我们直接使用sumFunc即可。

总的来说,也就是可以将函数作为一种类型进行声明使用。

小结

函数在我们的实际开发中是比较常用的,在之前我们还讲到了结构体方法,他们两者存在一些区别。

可以简单理解为,函数是独立的,而方法是与结构体进行关联的。

关于本节函数的讲解总结如下:

  • 使用func进行函数定义

  • 函数名称开头不能是数字

  • 可以传入多个参数

  • 可以返回多个参数

  • 可以使用可变参传递

  • 函数参数可以传入函数

  • 函数可以声明为一个变量进行使用

书籍地址:https://youcan.golang.website/

书籍代码:https://github.com/YouCanGolang

我的GitHub:https://github.com/swxctx

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Swxctx

您的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值