<>

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)
}
上一篇下一篇

猜你喜欢

热点阅读