1.基础定义
golang的函数很'纯粹',只有可变参数列表的概念,没有默认参数、可选参数、函数重载、操作符重载这些难以把控的概念
语法:'func'声明,而后函数名在前,中间的括号内定义参数,返回值类型在最后
func funcationName(parameter1,parameter2 int,parameter3 string) int{ }
2.多个返回值
golang的函数可以返回多个值,定义函数时将多个返回值类型用','分隔并用括号包含,同时函数体内的return语句中用','分隔返回值即可
func div(a,b int) (int,int){ return a / b,a % b }
返回值可以命名,且无需在return语句后加上返回值(一般在简单函数中使用),调用时有返回值提示
func div(a,b int) (q,r int){ q = a / b r = a % b //直接return仅用在简单函数内,复杂函数内会难以定位进行值返回的位置,增加代码的阅读难度 //复杂函数可用'return q,r'的形式 return }
多返回值常用在错误返回,第一个返回值为正常值,第二个返回值为错误信息(无错误时,返回'nil')
func div(a,b int) (result int, err error){ if b == 0{ return 0,fmt.Errorf("Divisor unlawful " ) } return a / b , nil}
3. 可变参数
可变参数:参数类型固定,个数可变
定义:variableName ...variableType
func sumList(num ...int) int{ sum := 0 for i := range num{ sum += i } return sum }
4.函数作为参数
golang虽然不是"纯粹"的函数式语言,但支持函数式编程,所以函数参数可以是函数
/* 参数为fun、a、b,fun:一个接受两个int,返回一个int的函数 */func apply(fun func(int,int) int, a,b int) int { return fun(a,b) }
测试代码
package mainimport ( "fmt" "math" "reflect" "runtime")/* 普通定义 */func div1(a, b int) (int, int) { return a / b, a % b }/* 返回值命名 */func div2(a, b int) (q, r int) { q = a / b r = a % b return}/* 返回错误信息 */func div3(a, b int) (result int, err error) { if b == 0 { return 0, fmt.Errorf("Divisor unlawful ") } return a / b, nil}/* 可变参数 */func sumList(num ...int) int{ sum := 0 for i := range num{ sum += i } return sum }/* 函数作为参数 */func apply(fun func(int,int) int, a,b int) int { f := reflect.ValueOf(fun).Pointer() //获取fun的指针 fName := runtime.FuncForPC(f).Name() //获取fun的名字 fmt.Printf("Calling funcation %s with ages (%d,%d)",fName,a,b ) return fun(a,b) }func max(a,b int) int { return int(math.Max(float64(a),float64(b))) }func main() { fmt.Println(div1(9, 6)) fmt.Println(div2(3, 4)) result, err := div3(1, 0) if err != nil { fmt.Println("Error : ", err) } else { fmt.Println(result) } fmt.Println(sumList(1,2,3,4,5)) //参数为函数max fmt.Println(apply(max,9,3)) //参数为匿名函数 fmt.Println(apply(func(a ,b int) int{ return int(math.Max(float64(a),float64(b))) },3,4)) }
原文出处:https://www.cnblogs.com/lz120792/p/9563550.html
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦