美文网首页我爱编程
08. Go极简教程 函数及闭包

08. Go极简教程 函数及闭包

作者: 超级大柱子 | 来源:发表于2018-06-03 00:14 被阅读53次

    Golang中, 函数是一等公民, 以下简要描述函数的使用

    函数的声明

    package main
    
    import (
        "log"
    )
    
    // 函数的创建
    func say() {
        log.Println("hello func")
    }
    
    func main() {
        // 函数的运行
        say()
        // 函数也是值
        add := func(x, y float64) float64 {
            return x + y
        }
        log.Println(add)       // 0x10b0cd0
        log.Println(add(3, 4)) // 7
    }
    
    // 参数, 返回值
    func sub1(a float64, b float64) float64 {
        return b - a
    }
    
    // 参数声明合并, 多个返回值
    func sub2(a, b float64) (float64, bool) {
        c := b - a
        ok := true
        if c >= 0 {
            ok = false
        }
        return c, ok
    }
    
    // 带命名的返回值
    func sub3(a, b float64) (c float64, ok bool) {
        // c 和 o k不需要再声明, 因为返回值里已经声明了
        c = b - a
        ok = true
        if c >= 0 {
            ok = false
        }
        return c, ok
    }
    
    

    闭包

    引用官方的解释:

    Go 函数可以是闭包的。闭包是一个函数值,它来自函数体的外部的变量引用。 函数可以对这个引用值进行访问和赋值;换句话说这个函数被“绑定”在这个变量上。

    例如,函数 adder 返回一个闭包。每个闭包都被绑定到其各自的 sum 变量上。

    package main
    
    import "log"
    
    // 函数的返回值是一个函数
    func adder(start int) func(int) int {
        sum := start
        return func(x int) int {
            sum += x
            return sum
        }
    }
    
    func main() {
        // pos, neg 都是一个闭包
        // 有权访问另一个函数作用域内变量的函数都是闭包
        pos, neg := adder(5000), adder(10)
        log.Println(pos(10), neg(10)) // 5010 20
    }
    

    给你可以对已有类型扩展方法

    package main
    
    import (
        "log"
    )
    
    // MyString - add log
    type MyString string
    
    func (f MyString) log() {
        log.Println(f)
    }
    
    func main() {
        f := MyString("hello MyString")
        f.log()
    }
    
    

    斐波纳契函数的例子

    package main
    
    import (
        "log"
        "time"
    )
    
    func main() {
        start := time.Now()
        log.Println(fibonacci(1000 * 1000000))   // 1000 * 百万次 111ns
        log.Println("耗时", time.Now().Sub(start)) //耗时 2.891275885s
    }
    func fibonacci(index int) int {
        if index == 1 || index == 2 {
            return 1
        }
        a, b := 1, 1
        for i := 3; i <= index; i++ {
            a, b = b, (a + b)
        }
        return a + b
    }
    
    

    参考资料:
    http://go-tour-zh.appspot.com

    Go极简教程 继续阅读( 目录)

    相关文章

      网友评论

        本文标题:08. Go极简教程 函数及闭包

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