golang日記 - 函数里的构造函数(匿名函数)

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可无数次调用的匿名函数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值