Golang 学习笔记(02)—— 函数

本文深入讲解Go语言中的函数定义、多返回值、变参函数、defer特性、函数类型及错误处理。通过实例演示如何实现多返回值、变长参数列表、资源释放、函数作为参数类型以及异常处理。

函数定义

函数 是每一门开发语言的最基础的部件,下面看下go语言中的函数是怎么定义的:

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

func是定义函数的关键字,Add是函数名称,int是返回值,小括号内是函数的参数。可以随意安排函数定义的顺序,go在编译时会扫描所以的文件。

##多返回值
go中函数支持多返回值,可以返回任意数量的返回值。多值返回在Go语言中是经常被用到的,比如,一个函数同时返回结果和异常。
下面我们看一个例子,divide函数是计算a/b的结果,返回商和余数。

package main
import "fmt"

func main(){
	quotient, remainder := divide(5, 3)
	fmt.Println("商为:", quotient, "余数为:", remainder)
}

func divide(a, b int)(int, int){
	quotient := a / b
	remainder := a % b
	return quotient, remainder
}

##变参函数
go中的函数支持变参,变参就是说函数可以有任意数量的参数。变参本质上就是一个slice,且必须是最后一个参数。将slice传递给变参函数时,注意用...展开,否则就当做单个参数处理了。
请看以下例子:

package main
import "fmt"

func main(){
	result := sum(3,5,7,9)
	fmt.Println("结果为:", result)
}

func sum(aregs ...int) int {
	s := 0
	for _, number := range aregs{
		s += number
	}
	return s
}


至于什么是slicerange又是什么鬼,在后面讲到数组的数组的时候详细介绍,slice就相当于数组,range类似一个循环,循环每个字元素的key, value。另外其中的_表示不接受改返回值。

defer

defer是go语言所特有的,defer的作用是延迟执行,在函数返回前,按照栈的形式后进先出的原则一次执行每个defer注册的函数。这样可以保证函数在返回前被调用,通常用来进行资源释放,错误的处理,清理数据等。下面是一个读文件的例子。

package main
import "fmt"
import "os"
func main(){
	str, err := readFile("main.go")
	if err != nil{
		fmt.Println(err.Error())
		return
	}
	fmt.Println(str)
}
func readFile(strFileName string)(string, error){
	f, err := os.Open(strFileName)
	if err != nil{
		fmt.Println("文件读取失败")
		return "", err
	}
	defer f.Close()
	buf := make([]byte, 1024)
	var strContent string = ""
	for{
		n, _ := f.Read(buf)
		if n == 0{
			break
		}
		strContent += string(buf[0:n])
	}
	return strContent, nil
}

函数类型

函数也是一种类型,拥有相同的参数,相同的返回值的函数,是同一种类型。用type来定义函数类型。下面例子中display函数输出大于5的数值。

package main
import "fmt"

type MyFuncType func(int) bool

func isBigThan5(n int)bool{
	return n > 5
}

func display(arr []int, f MyFuncType){
	for _, v := range arr{
		if f(v){
			fmt.Println(v)
		}
	}
}
func main(){
	arr := []int{1,2,3,4,5,6,7,8,9}
	display(arr, isBigThan5)
}


在上面的例子中,type MyFuncType func(int) bool定义了一个函数类型,将其命名为MyFuncType,接受一个int类型的参数,并返回一个bool类型的结果。isBigThan5MyFuncType类型的函数,函数类型。跟C里的函数指针有点像,他是可以把函数当做参数传入到另一个函数里,也有点像委托。

错误处理

go语言中没有try...catch...finally...这种结构化异常处理,而是用panic代替throw跑出异常。使用recover函数来捕获异常。Recover仅在defer函数中使用才能捕获到异常,此时函数的执行流程已经中断,无法恢复到后续位置继续执行。

package main
import "fmt"

func main(){
	test()
}
func test(){
	defer func (){
		if err := recover(); err != nil{
			fmt.Println(err)
		}
	}()
	divide(5,0)
	fmt.Println("end of test")
}

func divide(a, b int) int{
	return a / b
}

转载于:https://my.oschina.net/u/921799/blog/3045742

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值