<>
2018-09-29 本文已影响0人
凹大猫的鱼
使用函数的正确姿势#
什么是高阶函数?
1.接受其它的函数作为参数
2.把其它函数作为输出结果
满足任意一点都可以称为高阶函数!!
package main
import "fmt"
type funcVar func()
func func1(f funcVar){
f()
}
func func2(){
fmt.Println("I'am a function")
}
func func3() func(){
return func() {
fmt.Println("I'am an internal function")
}
}
func main(){
var f funcVar
f = func2
func1(f)
a := func3()
a()
}
闭包的概念
闭包个人了解就是函数和局部变量行成一个代码块,这样函数在后面可以访问到变量。感觉像是延迟调度。
package main
import "fmt"
type funcVar func()
func main(){
var a funcVar
a = func(i int)(func()){
return func() {
fmt.Println(i)
}
}(5)
a()
}
函数参数的改变
传入函数的参数如果是引用类型,那么会被改变,如果是值类型,那么不会被改变!!!!
对于复合类型
complex := [3][]int{
[]int{1,2}
[]int{3,4}
[]int{5,6}
}
如果更改数组的值比如在函数内部
complex[1]= []int{7,8}//没用!!!
但如果
complex[1][0] = 7//这样就会被改变了
问题
复合类型传入函数后,这个函数中对该值的修改会影响到它的值吗?
上面说过了,看你的修改方式
函数真正拿到的参数值其实只是他们的副本,那么返回给调用方的结果值也是复制的吗?
如果返回的是值,那么是复制的,如果是地址,那么就不会复制。
func func4() *int{
a := 10
fmt.Println(&a)
return &a
}
func func5() int{
a := 10
fmt.Println(&a)
return a
}
func main(){
/*var f funcVar
f = func2
func1(f)
a := func3()
a()*/
b := func4()
fmt.Println(b)
c := func5()
fmt.Println(&c)
}