函数定义
go语言中通过关键字 func 来定义函数
func 函数名(参数)返回指{
函数体
}
无参无返回值
func f1(){
fmt.Println("hello go")
}
有参无返回值
func f2(x int){
fmt.Println("hello go")
}
多个同类型参数可以省略上一个或者多个
func f3( x, y int,z bool){
fmt.Println(x,y,z)
}
单个参数也可以省略 但是不推荐使用
func f4( int){
fmt.Println("我这个参数怎么接")
}
无参有返回值
func f5() (z int) {
x := 10
y := 2
z = x * y
return
}
同样也可以省略
func f6() int {
x := 10
y := 2
return x * y
}
go 支持多个参数返回 多个参数返回必须要加括号
func f7() ( x,y int) {
x = 10
y = 2
return x,y
}
有参有返回值
func f8(x, y int) (z int) {
z = x * y
return
}
可变参数
可变参数可以接收多个同类型的参数
接收的数据结构是一个切片
func main() {
f5(10, 20,30,40)
}
func f9(x... int) {
fmt.Println(x)
}
//输出
//[10 20 30 40]
可变参数必须是在参数的最后一个
func f5(x, y string ,z... int) {
fmt.Println(x,y,z)
}
匿名函数
匿名函数 不需要有方法名字
匿名函数是立即使用的
num := func(x, y int) int {
return x * y
}(10, 20)
fmt.Println(num)
进阶 函数作为参数传递
func main() {
fmt.Println(calc(10,50,add))
}
func add(x, y int) (z int) {
z = x + y
return
}
func calc(x,y int ,op func(int ,int ) int )int{
return op(x,y)
}
进阶 函数作为返回值
func main() {
p := radd("+")
fmt.Println(p(10,20))
}
func radd (str string) (op func(int ,int ) int){
if str == "+"{
return add
}else{
return nil
}
}
进阶 闭包
闭包=函数+引用环境
从demo中看更直观
func main() {
var f = add_count()
fmt.Println(f(10))
fmt.Println(f(20))
fmt.Println(f(30))
fmt.Println(f(40))
}
func add_count() func(int) int {
var x int
return func(y int) int {
x += y
return x
}
}
//输出
//10 , 30 , 60 , 100
当f变量被声明出来后 形成了一个闭包
在其有效期内 声明的x会一直存在
简单的说 走一走debug就明白了。