我正在玩Go并且正在尝试实现一个fibonacci
函数,该函数返回一个返回斐波那契数字的闭包。问题可以在go工具之旅中找到。这是一个使用常规(非裸)返回的闭包实现:
package main
import "fmt"
// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
a := 0
b := 1
return func() int {
t := a + b
a = b
b = t
return b
}
}
func main() {
f := fibonacci()
for i := 0; i < 10; i++ {
fmt.Println(f())
}
}
该函数正确返回以下内容:
1
2
3
5
8
13
21
34
55
89
我尝试在闭包函数中使用裸返回来尝试不同地编写fibonacci
函数,但是它会产生错误:
./ compile20.go:9:7:b声明且未使用
以下是生成错误的代码
package main
import "fmt"
// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
a := 0
b := 1
return func() (b int) {
t := a + b
a = b
b = t
return
}
}
func main() {
f := fibonacci()
for i := 0; i < 10; i++ {
fmt.Println(f())
}
}
有人知道如何使用变量b
吗? b
显然用在闭包函数的第一行(t := a + b
)。
答案 0 :(得分:2)
返回段中定义的变量会影响外部作用域中具有相同名称的变量。在返回的函数中,<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="350dp"
android:layout_height="wrap_content"
android:background="@drawable/selector_button_grey"
android:clickable="true"
android:padding="5dp">
<ImageView
android:id="@+id/image_selector"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:background="@color/black"
android:src="@drawable/Nachos"
/>
<TextView
android:id="@+id/image_selector_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_below="@+id/image_selector"
android:gravity="center_horizontal|center_vertical"
android:paddingBottom="5dp"
android:paddingLeft="5dp"
android:textSize="18sp" />
</RelativeLayout>
指的是返回值中定义的函数。
您可以删除b
的第一个声明(和初始化),程序会通过检查,但逻辑不正确。
b