GO语言圣经笔记2|青训营笔记

49 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第5天

补充上一篇文章range<<运算符使用问题。

<<运算符:左移运算符"<<"是双目运算符。左移n位就是乘以2的n次方

其功能把"<<"左边的运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。

 var a unit = 60/* 60 = 0011 1100 */  
 c = a << 2     /* 240 = 1111 0000 */

go语言运算符补充阅读:地址

函数值

函数也是值。它们可以像其它值一样传递。

函数值可以用作函数的参数或返回值。

package main
​
import (
"fmt"
"math"
)
​
func compute(fn func(float64float64) float64float64 {
return fn(34)
}
​
func main() {
hypot := func(x, y float64) float64 {
return math.Sqrt(x*x + y*y)
}
fmt.Println(hypot(512))
​
fmt.Println(compute(hypot))
fmt.Println(compute(math.Pow))
}

代码注释:上述compute函数的参数是一个fn函数,fn函数是由两个浮点数的参数和一个浮点数返回值的函数组成,所以下面两次调用compute分别是自定的符合条件的hypot函数和math包中的Pow函数。

函数值的闭包

Go 函数可以是一个闭包。闭包是一个函数值,它引用了其函数体之外的变量。该函数可以访问并赋予其引用的变量的值,换句话说,该函数被这些变量“绑定”在一起。

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

PS:感觉有点像C语言中静态局部变量

package main
​
import "fmt"func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}
​
func main() {
pos, neg := adder(), adder()
for i := 0; i < 10; i++ {
fmt.Println(
pos(i),
neg(-2*i),
)
}
}

练习斐波那契闭包

实现一个 fibonacci 函数,它返回一个函数(闭包),该闭包返回一个斐波纳契数列 (0, 1, 1, 2, 3, 5, 8, 13...)

package main
​
import "fmt"// 返回一个“返回int的函数”
func fibonacci() func() int {
a, b, sum := 001
return func() int {
a = b
b = sum
sum = a+b
return a
}
}
​
func main() {
f := fibonacci()
for i := 0; i < 10; i++ {
fmt.Println(f())
}
}