学习Go语言的入门指南
我思考要开始学习Go语言,前几天我买下了下面这本参考书。
《Go语言入门》(作者:松尾爱贺)
首先,我试着打字确认了基本的语法和Go语言独特的习惯用法,突然面对了一个很难理解的概念。既然如此,为了加深自己的理解,我决定努力总结成一篇文章!
作为闭包的匿名函数
Go语言中的匿名函数被称为“闭包”。闭包在日语中称为“函数闭包”,它将与函数处理相关的“函数外部”环境一起封装成一个“闭合(闭包)”的结构。
我明白了,不懂。因为有一个样本,所以我决定去看一下。
package main
import "fmt"
// laterは「引数に文字列を取り、戻り値に文字列を返す関数」を返す関数
func later() func(string) string {
// storeはクロージャ内で使われている変数と結び付いた変数
// クロージャと結びついている限り破棄されない
var store string
fmt.Println("store: " + store) // debug
return func(next string) string { // F1(クロージャ)
fmt.Println("next: " + next) //debug
s := store // storeから一つ前に呼び出された文字列を取り出す
store = next // 今受け取っている文字列をstoreに格納
return s // 一つ前の文字列を返す
}
}
func main() {
f := later()
fmt.Println("a: " + f("Golang"))
fmt.Println("b: " + f("is"))
fmt.Println("c: " + f("awesome!"))
}
/* 出力
> store:
> next: Golang
> a:
> next: is
> b: Golang
> next: awesome!
> c:is
*/
我們可以看到以參數形式傳遞的字串,在下一個函數呼叫時返回。我想詳細研究為什麼會發生這種行為。
在中国,只需要一个选项将以下内容进行中文本地化:
f := later()的行为
首先,通过later()函数获取到的f是later()函数的返回值。也就是说,它接收一个“以字符串为参数并返回字符串的函数”(以下称为F1)。在F1的函数内部使用了变量store,它是在later()函数的本地变量中定义的。通常情况下,本地变量应该在函数执行结束后被销毁。然而,在像本例这样的闭包内部使用变量的情况下,它在内部被作为闭包的变量来操作。具体来说,只要闭包被引用,变量store就不会被销毁。(只要使用f := later()的f,store的状态就会被保留)
“Golang”的行为是什么?
-
- 首先,将”Golang”作为F1函数的参数next传入。
由于store为空,所以变量s将返回””。
将”Golang”赋值给store,即store接收到”Golang”。
返回值为空。
“f(“is”)的行为”
-
- 在store中存储的是在传递给f(“ Golang”)时传递的“ Golang”,因此在s中存储了“ Golang”。这是关键。
store = next,则“is”被传递给store。
返回值为“ Golang”。
通过闭包的功能,我们可以确认store内的状态确实被保持住了。
这个功能有什么令人高兴的地方,我们下次再调查整理一下。这次就到这里!