golang日記

来源:互联网 发布:深圳市国税开票软件 编辑:程序博客网 时间:2024/05/29 14:55

The Go Programming Language书的5.6节匿名函数中,有以下代码

func squares() func() int {    var x int    return func() int {        x++        return x * x    }}func main() {    f := squares()    fmt.Println(f()) // "1"    fmt.Println(f()) // "4"    fmt.Println(f()) // "9"    fmt.Println(f()) // "16"}

先分析一下这段代码

函数func squares() func() int { … }
return func() int {…}

这两个部分, 重复的是 func() int{}, 所以我们可以猜测, 这起到链接的作用. 那么这段代码分析下来. squares()返回类型func()匿名函数, 使用func()匿名函数后, 返回类型int.

这里出现的问题, 类型名该不该含有 括号()?
假设是需要括号, 那么上面代码就变成

f() := squares()

这样的话导致的问题
1. 函数和数据的界限就变得不清晰, 这会导致看代码人不知道实质调用了几次函数
2. 代码变得不简洁, 如果我们要重复调用 squares()的匿名函数, 这就要多加一些字符, 如f().()

函数可以当作类型返回, 这让golang的函数变得和Java中的构造函数的表达方式有点像,
Java类=>Golang函数
Java构造函数=>Golang可无数次调用的匿名函数

原创粉丝点击