文章目录
前言
Golang作为一种面向对象的语言,函数式编程的思想十分重要。不同语言的特点各有不同,在函数方面我总结了以下几点
go支持:可变长参数;函数也可作为一种类型,可以作为参数传递、赋值;支持匿名函数、闭包;支持多个返回值或无返回值;支持命名参数返回
不支持:一般情况下,有名函数不支持嵌套,匿名函数可以嵌套;不支持重载(一个包中函数名不能重复);不支持默认参数
定义
函数定义格式:
func function_name([参数列表]) ([返回值列表]) {
函数体
}
需要注意的是左花括号必须接在函数定义行的最右边
有参数和有返回值的函数的定义与使用:
func add(num1 int,num2 int) int {
result:=num1+num2
fmt.Println("这是add():",result)
return result
}
匿名函数
函数可以作为类型赋值给变量去使用:
func func1() {
a := func() {
fmt.Println("这是匿名函数的赋值后调用")
}
a()
}
匿名函数的定义与直接调用:
func func1() {
//需要注意的是:无返回值时无法赋值给变量
func () {
fmt.Println("这是匿名函数的直接调用")
}()
}
形参同一类型时在最后声明类型即可:
func add(num1,num2 int) int {
result:=num1+num2
return result
}
多返回值时用()包括,以,分隔
func add2(num1,num2 int) (int,int) {
return num1,num2
}
命名参数返回
在函数定义时就定义返回变量
func add3() (result int) {
result = 1+1 //这里就不需要定义result了
return //直接return默认就return result了
}
可变长参数传递
func myargs(nums ...int) {
fmt.Println(nums)
}
把函数作为参数传入
func test(func_arg func(int,int) int,num1 ,num2 int) {
result := func_arg(num1,num2)
fmt.Println("这是test():",result)
}
自定义类型来表示一个函数类型
type myfunc func(int,int) int
func test2(func_arg myfunc,num1,num2 int) {
fmt.Println(func_arg(num1,num2))
}
把函数作为参数返回
func test3() func() int {
return func() int {
fmt.Println("这是test3: 把函数作为参数返回")
return 10
}
}
闭包
一个局部变量会随着函数的调用而生成,调用结束而释放
而使用闭包可以让临时变量不随函数调用结束而释放
闭包的三个条件:
有内外函数
外函数要返回内函数
内函数要引用外函数变量
func closure(x int) func(int) int {
fmt.Println("clousure x is:",x)
return func(y int) int {
fmt.Println("内函数的x:",x)
fmt.Println("内函数的y:",y)
return x+y
}
}
总结
本章介绍了go函数的定义与基本使用,介绍比较简单,更多的使用可以浏览其它大佬的文章或者期待我的后续更新,如有不足之处,欢迎评论留言,会第一时间改正,最后附上源码,方便读者一键体验。
源码
package main
import (
"fmt"
)
/**
@file:01序章
@author:zh
@desc:
@date:2023/4/22
*/
/*
面向对象
函数式编程
支持:
可变长参数
函数也可作为一种类型,可以作为参数传递、赋值
支持匿名函数、闭包
支持多个返回值或无返回值
支持命名参数返回
不支持:
一般情况下,有名函数不支持嵌套,匿名函数可以嵌套
不支持重载(一个包中函数名不能重复)
不支持默认参数
函数定义格式:
func function_name([参数列表]) ([返回值列表]) {
函数体
}
需要注意的是左花括号必须接在函数定义行的最右边
*/
func main() {
fmt.Println("i am main")
func1()
//调用有返回值的函数也可以不接收返回值而直接调用
add(1,2)
result := add(1,2)
fmt.Println(result)
//多个返回值时要用多个变量接收
a, _ := add2(3, 4)
fmt.Println(a)
//可变长参数传递
myargs(1)
myargs(1,2,3)
//调用将函数作为形参的函数
test(add,5,6)
//调用返回函数的函数
//这里function是一个无参数传入,返回类型为int的函数
fuction := test3()
fmt.Println(fuction())
//闭包函数调用
mybibao := closure(10)
fmt.Println(mybibao(20))
fmt.Println()
}
func func1() {
fmt.Println("i am func1")
//匿名函数,函数可以作为类型赋值给变量去使用
a := func() {
fmt.Println("这是匿名函数的赋值后调用")
}
a()
//匿名函数的定义与直接调用
//需要注意的是:无返回值时无法赋值给变量
func () {
fmt.Println("这是匿名函数的直接调用")
}()
}
//有参数和有返回值的函数的定义与使用
func add(num1 int,num2 int) int {
result:=num1+num2
fmt.Println("这是add():",result)
return result
}
//形参同一类型时在最后声明类型即可
//多返回值时用()包括,以,分隔
func add2(num1,num2 int) (int,int) {
return num1,num2
}
//命名参数返回
//在函数定义时定义返回变量
func add3() (result int) {
result = 1+1 //这里就不需要定义result了
return //直接return默认就return result了
}
//可变长参数传递
func myargs(nums ...int) {
fmt.Println(nums)
}
//把函数作为参数传入
func test(func_arg func(int,int) int,num1 ,num2 int) {
result := func_arg(num1,num2)
fmt.Println("这是test():",result)
}
//自定义类型来表示一个函数类型
type myfunc func(int,int) int
func test2(func_arg myfunc,num1,num2 int) {
fmt.Println(func_arg(num1,num2))
}
//把函数作为参数返回
func test3() func() int {
return func() int {
fmt.Println("这是test3: 把函数作为参数返回")
return 10
}
}
type myfunc2 func() int
func test4() myfunc2 {
return func() int {
fmt.Println("把type2类型函数作为参数返回")
return 12
}
}
//闭包
//一个局部变量会随着函数的调用而生成,调用结束而释放
//使用闭包可以让临时变量不随函数调用结束而释放
/*
闭包的三个条件:
有内外函数
外函数要返回内函数
内函数要引用外函数变量
*/
func closure(x int) func(int) int {
fmt.Println("clousure x is:",x)
return func(y int) int {
fmt.Println("内函数的x:",x)
fmt.Println("内函数的y:",y)
return x+y
}
}