学习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”的行为是什么?

    1. 首先,将”Golang”作为F1函数的参数next传入。

由于store为空,所以变量s将返回””。

将”Golang”赋值给store,即store接收到”Golang”。

返回值为空。

“f(“is”)的行为”

    1. 在store中存储的是在传递给f(“ Golang”)时传递的“ Golang”,因此在s中存储了“ Golang”。这是关键。

store = next,则“is”被传递给store。
返回值为“ Golang”。

通过闭包的功能,我们可以确认store内的状态确实被保持住了。

这个功能有什么令人高兴的地方,我们下次再调查整理一下。这次就到这里!

广告
将在 10 秒后关闭
bannerAds