定义,但是自定义函数类型的定义必须在使用这个自定义函数类型的前面
举例说明
不使用自定义函数
func myfunc(funcvar func(int,int) int ,num int) int { //没有使用自定义函数类型时,函数类型作为形参在参数列表时需要写很长
return funcvar(num)
}
使用自定义函数类型
type myfunctype func(int,int) int
func myfunc(funcvar myfunctype ,num int) int { //自定义函数类型后,函数作为形参,在参数列表不用写很长
return funcvar(num)
}
(12) Go语言支持对函数返回值命名
优点:不用一个一个在return中对应的写返回的值
举例说明
package main
import “fmt”
func main(){
n := 12
m := 4
sum ,sub :=myfunc(n,m)
}
func myfunc(n int , m int)(sum int,sub int) { //把返回的值定义好
sum = n + m //直接使用=等号赋值就行
sub = n-m
return //返回时不用填任何返回数据,并且返回时不用担心对应关系,只需在接收时对应好就行
}
(13) 使用_下划线标识符忽略返回值
package main
import “fmt”
func main(){
n := 12
m := 4
sum ,_:=myfunc(n,m) //忽略返回值sub
}
func myfunc(n int , m int)(sum int,sub int) {
sum = n + m
sub = n-m
return
}
(14) Go语言函数支持可变参数
基本语法:
func sum(args... int) sum int {
//代码
}
func sum(n1 int,args... int) sum int {
//代码
}
使用注意
args其实是一个slice切片,通过args[index]可以访问到各个值,如果一个函数形参列表有可变参数,和其他参数,那么可变参数要放在最后,否则报错
案例演示
package main
import “fmt”
func main(){
n := sum(3,1,2,3,4,5,6)
fmt.Println(n)
}
func sum(n int , args... int ) int {
s := 0
for i := 0 ; i < len(args) ; i++ {
if args[i] == n {
break
}
s += args[i]
}
return s
}
运行结果
3
(15) 如果在函数的形参列表中,两个或者多个形参的数据类型一样,那么可以省略前面几个,最后写一个就行
func sum(n , m , b ,c int) int {
//代码
}
8、包的使用和使用原理
包的使用原理
包的本质其实就是创建不同的文件夹来存放程序文件
包的相关说明
使用注意
导入包时,路径必须从src下的某个目录开始算,比如,src文件夹下有一个utils文件,utils文件下有一个utils.go文件,那么,在main.go中导入utils包下的utils.go的某个变量或者函数的路径是:import “utils”
9、使用包的注意事项
1)在给一个文件打包时,该报对应一个文件夹。文件的包通常和文件所在的文件夹名是一直的,一般为小写
2)当一个文件要使用其他包的函数或者变量时,需要先引入对应的包
引包方式1:import 包名
引包方式2:import (
“包名1”
“包名2”
)
3)package指令在文件第一行,然后接着是import导包命令
4)在import包时,路径从计算机环境变量$GOPATH下的src目录开始算,不用带src目录,编译器会自动从src开始引入
5)为了让其他包可以访问到本包的函数或者变量,则该函数或者变量的首字母必须大写
6)在访问其他包的函数或者变量时,语法是:包名.函数名或者包.变量
7)如果包名过长,Go语言支持跟包名取别名,如果取了别名,那么原来的包名就不能用
8)在同一个包下面不能有重复的变量名,否则包重复定义
说明:如果包取了别名,则必须使用别名来访问包中的函数或者变量
9)如果两个.go文件打了同一个包,并且这两个文件都有同一个名字的函数或者变量,这样都会报错,因为同一个包下只能有一个函数名或者变量名,即使这个两个函数名被定义在两个不同的但是打了同一个包的文件
10)在一个go程序中,main包只能有一个
函数中return语句使用注意
注意:对于函数的返回值,如果函数返回多个值,但是你只需要某个值,那么不需要的值可以使用下划线接受,例如: _ , a := getSum(a,b)。
10、函数之递归调用
基本介绍
一个函数体内调用了本身,我们称为递归调用
案例演示
func test( a int ) {
if a > 2 {
a--
test(a)
}
fmt.Println(a)
}
func main(){
test(4)
}
运行结果:
2
2
3
执行流程
使用注意
① 递归每执行一个函数时,就创建一个新的受保护的独立的空间,也可以说是一个新的函数栈
② 函数的局部变量是独立的,不会相互影响
③ 递归必须向退出递归的条件逼近,否则就是无限递归
④ 当一个函数执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁。执行完毕时,或者返回时,该函数栈会被销毁
(1) 书写递归的重要思想就是:寻找出路
11、递归之解决斐波那契数列
(2) 比如有一个数列:1 1 2 3 5 7 12 19.......
(3) 实现思路
1、当数列在1和2位置时值为1
2、数列的前一个数和后一个数相加等于第三个数
(4) 实现代码
package main
import “fmt”
func main{
//1 1 2 3 5 ....
n := 0
fmt.Print("请输入你要查找的数:")
fmt.Scanln(&n)
a := fibonaqi(n)
fmt.Println(a)
}
//求斐波那契第n个位置的值
func fibonaqi(n int) int {
if n == 1 || n == 2 {
return 1
}
return fibonaqi(n-1)+fibonaqi(n-2)
}
运行结果:
12、求函数值
已知f(1)=3,f(n)=2*f(n-1)+1,请使用递归求出n为任意数的值
解题