GO语言基础入门-函数篇 | 青训营笔记

125 阅读2分钟

前言

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天,其实第五届青训营已经正式开课n多天了,笔记现在才发出来是因为一直在补充,所以现在才发出来,包括我听完课之后的总结和平时自己的学习积累,分享出来给有需要的朋友。

本文内容

本文将涉及到go语言的函数的基本介绍、基本格式和基本使用,还列举了经典递归案例来加深对GO语言函数的认识,帮助小白迅速了解golang函数的知识和使用。

一、Go语言基础

GO语言函数介绍

Go 语言中函数和大多数函数类似,且每个可执行的go文件都最少有个 main() 函数。以下是GO函数的特点:

支持:

无需声明原型
支持不定变参
支持多返回值
支持命名返回参数
支持匿名函数和闭包
函数也是一种类型,一个函数可以赋值给变量

不支持:

不支持嵌套 (nested) 一个包不能有两个名字一样的函数
不支持 重载 (overload)
不支持 默认参数 (default parameter)

函数的基本格式

函数声明告诉了编译器函数的名称,参数,和返回类型

func name( [parameter list] ) [return_types] {
   函数体
}

不同函数用法

1.简单定义一个函数
func test() { 
    fmt.Println("hello world!")
}
2.带可变参数的函数
func sum(n1 int, args ...int) { //可变参数要放在最后
    sum := n1 + args[0] //取出args=(20,30)中的第一个值+n1
    fmt.Println(sum)    //sum(10,20,30)结果应为30
}
3.带返回值的函数
func get_sum(a int, b int) int { //注意这边要声明函数返回值类型
    sum := a + b
    return sum
}
4.带多个返回值的函数
func handle_num(c int, d int) (int, int) { //返回两个值时要用括号声明类型
    sum := c + d
    sub := c - d
    return sum, sub
}
5.递归调用函数
func Recursion(n int) {
    if n > 2 {
        n--
        Recursion(n)  
    }
    fmt.Println(n)
}

Recursion(4) 输出结果为: 2 2 3

注意:递归调用时,因为栈是先进后出,程序执行时先进3 然后2 最后 2,所以出去是2 2 3。

6.匿名函数

Go语言支持随时在代码里定义匿名函数。

匿名函数由一个不带函数名的函数声明和函数体组成

func(a, b int, z float64) bool {
     return a*b <int(z)
}

匿名函数可以直接赋值给一个变量或者直接执行:

f := func(x, y int) int {
     return x + y
}
func(ch chan int) {
    ch <- ACK
} (reply_chan) // 花括号后直接跟参数列表表示函数调用

值传递和引用传递

默认情况下,GO语言使用的是值传递,即在调用过程中只是拷贝一份变量值,并不会影响到实际参数。

如果需要在函数内更改外面的变量,可以使用引用传递,即传递变量地址

num1=10
num2=10
func test2 (num1 *int,num2 int) {
    *num1=20 //引用传递
    num2=20  //值传递
}
fmt.Println(num1,num2)

运行结果为20,10,只有引用传递才可以改变外面的值

经典案例

通过经典练习案例来熟悉GO语言函数的基本操作,以及递归的使用。

1.求斐波那契数列

斐波那契数列形如1,1,2,3,5,8,13....,即下一个数是前两个数的和,写出计算程序。

func fbn(n int) int {
    if n == 1 || n == 2 {
        return 1
    } else {
        return fbn(n-1) + fbn(n-2)
    }
}
2.猴子吃桃问题

问题:猴子吃桃,第一天吃了其中的一半,接下来每天都吃其中的一半,然后再多吃一个,当第十天时,想吃(还没吃)发现只有一个桃子了。问:最初有多少个桃子?

思路分析:

吃桃函数f,每天还没吃桃之前数量为f(n),n为第几天

则第十天桃子数为:n=10 f(n)=1

假设昨天有M个桃(还没吃之前)

则昨天吃桃后数量为 M/2-1=今天的桃,那么我们倒推,计算昨天的桃

昨天的桃(还没吃之前)= (今天的桃+1)*2,设昨天的天数为n,

又根据吃桃函数今天的桃为f(n+1),所以昨天的桃=(今天的桃+1)2=(f(n+1)+1) 2,

得到公式第n天桃=(f(n+1)+1)*2

第十天:1个桃

第九天(还没吃时):(f(10)+1)2 也就是(f(n+1)+1) 2个

第八天(还没吃时):(f(9)+1)2 也就是(f(n+1)+1) 2个

实现代码:

func eat_peach(n int) int {
    if n == 10 {
        return 1
    } else {
        return (eat_peach(n+1) + 1) * 2 
    }
}

结果为第一天桃子数为1534个。

总结

1.Go语言中的方法,相比于函数,多了一个接收者参数:
2.Go 语言里有两种类型的接收者:值接收者和指针接收者。

写在最后

本文是我的日常学习笔记,如果哪里有写错,麻烦请指出来,感谢。这里我也推荐大家多写笔记,写笔记是一个很好的习惯,可以帮助我们更好的吸收和理解学习的新知识,新的一年大家一起加油!