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