函数的声明
在Go语言中,函数定义语法如下:
func 函数名(参数1 类型,参数2 类型) (返回值类型){
//函数体(具体实现的功能) 返回值
}
函数中的参数列表和返回值并非是必须的,所以下面代码示例有些是不带的。
代码示例:
1.无参数,无返回值
package main
import "fmt"
func main() {
test() #调用test函数
}
func test() { #定义的test函数,无返回值,无参数
fmt.Println("xxxxxx")
}
#结果
xxxxxx
2.带参数,无返回值
package main
import "fmt"
func main() {
test(2,5)
}
func test(a int,b int) { #如果参数类型是一样的,可以写成 a,b int
fmt.Println(a+b)
}
#结果
7
3.带参数,有一个返回值
package main
func main() {
print(test(3,9))
}
func test(a ,b int) int { #有返回值时,必须指定返回值的数据类型
return a+b
}
4.带参数,有多个返回值
package main
import "fmt"
func main() {
var a int
var b string
a,b=test(3,9) #a,b参数接收
fmt.Print(a,b)
}
func test(a int,b int) (int,string) { #返回多个值,需要用(),接收也需要两个参数接收
return a+b,"aaa" #返回一个int,一个string类型值
}
5.命名返回值
package main
import "fmt"
func main() {
fmt.Print(test1(1,2))
}
func test1(a,b int) (j int, k string) { #命名返回值j,k
j=a+b
k="xxx"
return #不需要明确指定返回值,默认返回j,k
}
#结果
3xxx
不定长参数
package main
import "fmt"
func main() {
test1(1,"aaa")
}
//不定长参数
func test1(a ...interface{}) { #也可以写成a ...int 接收int类型参数
fmt.Println(a)
}#结果[1,aaa]
函数高级
内层函数:定义在函数内部的函数
go中函数内部定义的函数是不能有名的,需要定义匿名函数:没有名字
func test(a int) {
func() { #定义在内层的函数不能有名字
fmt.Println("我是内层函数")
}()
}
闭包函数:定义在函数内部,对外部作用域有引用
在go语言中,函数是一等公民,可以把函数赋值给一个变量,函数就是一等公民
package main
import "fmt"
//闭包函数 传入int类型,返回值是函数
func test3(a int) func() { # a是参数,func()是返回值类型是个函数
b:= func() {
fmt.Println(a)
fmt.Println("我是闭包函数")
}
return b
}
func main() {
a:=test3(3) #结果是返回值函数b
a() #加括号调用函数b
}
#结果
3
我是闭包函数
闭包函数:传入函数,返回值是函数
package main
import "fmt"
//定义一个函数,传入函数,返回值是函数
func test4(a func()) func() {
b:= func() {
fmt.Println("我先执行")
a()
fmt.Println("函数执行完了")
}
return b
}
func test5() {
fmt.Println("xxx")
}
func main() {
a:=test5 #a是test5函数
a=test4(a) #把函数a当做参数传入到test4中,获得返回值b
a() #返回值b加括号调用,就是test4中定义的b函数
}
来源:https://www.cnblogs.com/wangcuican/p/12016524.html