Go函数的使用

600 阅读7分钟

函数是指一段可以直接被另一段程序或代码引用的程序或代码,在Go语言中,函数是它的构成语言构成之一

函数的格式

func 函数名([参数列表])([返回参数列表]){ 代码块 }

[ ]在这里,表示的是可选的意思

有名函数

无参、无返回值函数

package main
import "fmt"

func test(){
	fmt.Println("我是无参数,无返回值的函数")
}

func main()  {
	test()
}
//输出:我是无参数,无返回值的函数

上面创建了一个名为test的函数,test()括号中,没有一个参数在里面,也就是无参,test()后面没有参数,也就是没有返回值,如果有返回值,是什么样子,看下面的例子。

有参,无返回值函数

package main
import "fmt"

func testAdd(a int, b int){
	sum := a + b
	fmt.Println("我是有参数,无返回值的函数,这两个参数相加为:", sum)
}

func main() {
	testAdd(10, 30)
}
//输出:我是有参数,无返回值的函数,这两个参数相加为: 40

这里创建了一个函数 testAdd,在testAdd()中,我们给了两个参数,分别是 a,b它们的类型是 int类型,所以我们在调用它的时候,需要分别给这两个位置传进去 int类型的变量或者常量,上面我们传进去了两个数,分别是 10和30,然后运行,输出了它们的和40

有参、有返回值

一个返回值的情况

package main
import "fmt"

func testAdd(a int, b int) (sum int){
	fmt.Println("我是有参数,有返回值的函数")
	sum = a + b
	return sum
}

func main()  {
	sum := testAdd(10, 30)
	fmt.Println("调用testAdd()函数后,它返回来的值为:", sum)
}
//输出:我是有参数,有返回值的函数
// 调用testAdd()函数后,它返回来的值为: 40

基于前一个例子,我们改造了下 testAdd()函数,在这个函数中,添加了个名为 sum,类型为int的返回值,然后把函数内执行后的内容,返回给了调用 testAdd()函数的main()函数,不过返回的类型必须跟你规定的返回类型一样,也就是int

注:在这里,如果你只有一个返回类型并且没有给这个返回类型指定变量名的话,可以不写括号的;如果你有给返回类型指定了变量还去掉括号的话,就会报错

func testAdd(a int, b int) int{
	fmt.Println("我是有参数,有返回值的函数")
	sum := a + b
	return sum
}

多个返回值的情况

package main
import "fmt"

func testAdd(a int, b int) (int, int, int){
	fmt.Println("我是有参数,有返回值的函数")
	sum := a + b
	return a, b, sum
}

func main()  {
	a, b, sum := testAdd(10, 30)
	fmt.Println("调用testAdd()函数后,它返回来的值为:", a, b, sum)
}

我们还是基于上面,把这个函数改造了,不过这时候,我们没有给任何一个返回值起变量名,我们重点要看的是,调用了这个函数后返回的值,需要怎么接收处理,从 testAdd()函数的 return语句可以看出,我们分别把函数调用传进来的值都给返回去了(这不是必须的,我只是不想多创建两个int类型的值返回去而已),还把两个的值的和作为返回值返回了。这里你要注意一下,它返回的内容的顺序,这样才知道要怎么处理这些返回值。

注意:这个多值返回,可以给它们取一个变量名,不过我这并没有这么做而已

把有名函数当做变量赋值

package main
import "fmt"

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

func main()  {
	function := testAdd
	a, b, sum := function(10, 30)
	fmt.Println("调用function()函数后,它返回来的值为:", a, b, sum)
}
//输出:调用function()函数后,它返回来的值为: 10 30 40

从上面的代码可以看出,我们直接把变量名赋值给了一个新的变量,赋值后,这个变量的类型,就变成跟 testAdd()函数的类型一样了,你们可以用格式化打印出它们两个的类型,我给你们一个打印好的内容,如下

func(int, int) (int, int, int)

这里打印的这个,是 testAdd的函数类型,也叫做函数签名,还是一个比较重要的东西

package main

import "fmt"

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

func testSub(a int, b int) (int, int, int){
	result := a - b
	return a, b, result
}

func main()  {
	fmt.Printf("testAdd()函数的类型是:%T \n", testAdd)
	fmt.Printf("testSub()函数的类型是:%T", testSub)
}
//输出:testAdd()函数的类型是:func(int, int) (int, int, int)
//testSub()函数的类型是:func(int, int) (int, int, int)

看到没,函数名不同,但输出的函数类型是一样的,其实在Go中,你只要参数还有返回值的个数、顺序还有类型都相同的话,就算是函数签名一样了

匿名函数

直接赋值给函数变量

package main

import "fmt"

func main()  {

	sum := func(a int, b int) int {
		return a + b
	}
	fmt.Printf("sum的类型为:%T\n", sum)

	//使用匿名函数
	fmt.Println("调用sum之后的输出为:", sum(10, 30))
}
//输出:
//sum的类型为:func(int, int) int
//调用sum之后的输出为: 40

另一种使用匿名函数的方法

package main

import "fmt"

func main()  {

	sum := func(a int, b int) int {
		return a + b
	}(10, 20)

	fmt.Println("匿名函数 func的输出为:", sum)
}
//输出:匿名函数 func的输出为: 30

我们直接写一个匿名函数后,在{ }后面添加个(),把你要多少个参数传递进去,然后接收这个匿名函数的返回值即可(前提是这个匿名函数有返回值)

函数的返回类型是函数

package main

import "fmt"

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

func main()  {
	returnFunc := testReturnIsFunc()
	sum := returnFunc(10, 30)
	fmt.Printf("returnFunc的类型为:%T\n", returnFunc)
	fmt.Printf("sum的类型为:%T\n", sum)
	fmt.Println("最后返回的值为:", sum)
}
//输出:
//returnFunc的类型为:func(int, int) int
//sum的类型为:int
//最后返回的值为: 40

我们创建了一个 testReturnFunc的无参函数,它的返回值是一个函数 func(a int , b int) int,而且这个返回值函数,还有个返回值,那么我们在调用它的时候,要怎么做呢?

我们先调用 testReturnFunc()函数,然后返回了一个函数,我们把这个函数赋值为函数变量,再调用这个函数变量,把需要的值传递进去,最终得到需要返回的函数的返回值,如上面的代码所见

不定参数的函数

有时候,我们需要传递很多个参数给别的函数,而且具体是多少个我们不是很确定,如果写多、写少都很不好。这时候我们可以用到Go语言给我们提供的不定参数

格式

func 函数名(参数名...参数类型)([返回值类型]){代码块}

注:这里的 ... 是必须的

代码实现

package main

import "fmt"

func sum(args...int) int {
	var result int = 0
	for index, val := range args{
		fmt.Printf("第%v个值,这个数为:%v \n",index ,val)
		result = result + val
	}
	return result
}
func main()  {
	result := sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
	fmt.Println("最后的结果为:", result)
}

输出,这里用的是 for-range去输出内容

第0个值,这个数为:1
第1个值,这个数为:2
第2个值,这个数为:3
第3个值,这个数为:4
第4个值,这个数为:5
第5个值,这个数为:6
第6个值,这个数为:7
第7个值,这个数为:8
第8个值,这个数为:9
第9个值,这个数为:10
最后的结果为: 55

结尾处

注:在Go语言中,如果变量名首字母大写,即代表着是个公有的变量;如果是变量首字母小写,代表着这个变量是私有的,函数名也跟变量一样的规则。

至于什么是公有、私有,这个其实就是控制变量的访问范围


欢迎大家关注下个人的「公众号」:独醉贪欢