<>

作者: 凹大猫的鱼 | 来源:发表于2018-09-29 15:00 被阅读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)
    }

    相关文章

      网友评论

          本文标题:<>

          本文链接:https://www.haomeiwen.com/subject/jntboftx.html