我爱编程

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

2018-06-03  本文已影响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极简教程 继续阅读( 目录)

上一篇 下一篇

猜你喜欢

热点阅读