月度归档:2020年02月

go语言中对闭包的理解和实例演示

go中的函数闭包(Function Closures)对于我来说比较难理解, 在之前的开发中也没有用到其他语言的闭包特性, 所以特意认真学习了一下. 下面我会详细解释我对go中闭包的理解和一个实例用法.

简单来说, 闭包在go中的实现方法就是在函数中嵌套另一个子函数, 如下代码片段所示(摘自官方教程):

func adder() func(int) int {
	sum := 0
	return func(x int) int {
		sum += x
		return sum
	}
}

可以看到, 创建了一个名为adder()的函数, 函数中有一个局部变量sum, 闭包的第一个特性就是可以直接访问父函数的变量, 所以在内部函数中直接使用了sum.

ad := adder()
fmt.Println(ad(10))

这样子就是对闭包特性的一次使用. 函数也是一个变量存在到内存中的, 所以可以把ad作为函数的reference, 在println语句中, 是ad第一次调用, 这里通过函数的reference传入的值实际上是传到了adder()中的匿名函数里, 即x = 10.

我在初次学习中对这里有疑惑, 不理解ad := adder(), 其实这句话可以根据字面意思理解, 即把adder()的返回值赋给ad, 由于adder()的返回值是一个匿名函数, 那么我们就拿到了匿名函数的reference, 下面使用ad(10)传入值也就理所当然了.

下面我用一个更好的例子来解释:

func minusValue(a, b int) func(int) int {
	fmt.Println("this is from minusValue, and a is", a, "b is", b)
	sum := a + b
	return func(para int) int {
		sum += para
		fmt.Println("this is from inner func and sum is", sum)
		return sum
	}
}

我直接使用minusValue(1,2)调用它, 那么控制台只会输出this is from minusValue, and a is 1 b is 2. 这里大家都理解. 当我用下面的方法调用, 就体现出了闭包的另一个特性, 闭包匿名函数中返回的变量只要还有reference在用, 那么它就会一直存在到内存中, 请看下面的调用和结果输出:

f := minusValue(1,2)
f(10)
f(10)
fmt.Println("----------------")
n := minusValue(10,20)
n(100)

输出:

这就是闭包的用法以及特性, 那么在实际的生产中, 也有着很多作用(我也是才知道), 例如(来源):
编写一个程序,具体要求如下:

编写一个函数 makeSuffix(suffix string) ,可以接收一个文件后缀名(比如.jpg),并返回一个闭包;
调用闭包,可以传入一个文件名,如果该文件名没有指定的后缀(比如 .jpg),则返回 文件名.jpg,如果有 .jpg后缀,则返回源文件名;
strings.HasSuffix,该函数可以判断某个字符串是否有指定的后缀。

答案:

package main

import (
	"fmt"
	"strings"
)
func makesuffix(suffix string) func(string) string {
	return func(name string) string {
		//如果name没有指定的后缀,则加上,否则就返回原来的名字
		if !strings.HasSuffix(name, suffix) {
			return name + suffix
		}
		return name
	}
}

func main() {
	f2 :=makesuffix(".jpg")
	fmt.Println("文件名处理后=", f2("winter"))
	fmt.Println("文件名处理后=", f2("bird.jpg"))
}

通过使用闭包的特性, 预先”设置”一个要处理的后缀, 之后通过不断调用闭包的reference, 就可以达到所需要求.

性能超强的Upcloud服务器推荐, 注册送25美元, 推荐送50美元

注册链接: https://upcloud.com/signup/?promo=4HX29A (送25美元)
最近在为新项目寻找服务器, 常见的linode, vultrDO等等线路不错, 但是因为购买众多, 而且用户验证较简单, 只有linode是需要信用卡验证的, 所以很多IP都被人拿来翻墙用, 在中国境内无法访问.
upcloud是新开的一个商家, 新用户注册就送25美元, 对于推荐人来说, 每次推荐一个人, 会送50美元. 还是十分划算的. 服务器性能十分强, 使用的是因特尔的gold级别CPU. 同时, 到中国的网络也是不错的. 下面是详细的测试:


虽然这款VPS的性价比是很棒的, 但是由于我的项目需要把数据缓存到内存中, 对内存的占用较大, 如果直接升级到10或者20美元每月的套餐, 是十分不划算的, 所以我最终选择了线路较差, 但是内存性能较高的欧洲服务器netcup.

2020重听老歌 – 明天會更好, 紅蜻蜓, 爱

晚上在随意看YouTube视频时, YouTube算法推荐给我了明天会更好的MV. 在评论里看到一条很有意思的回复:

虽然评论说的很绝对, 但是我是基本上认同的. MV中的歌手看起来就是很普通的人, 在街上遇到也不一定可以认出来. 我也十分反感现在的明星, 依靠制造各种事件来获取热度. 依靠炒作获得的流量, 很容易在一定的时间后就消失了, 事实也是如此, 热门明星每几个月换一个人, 难得有非常棒的作品让我记住的.

继续阅读

iPhone 11 Smart Battery Case智能电池壳, 1000元的充电宝?

不是智商税. 充电壳≠充电宝(它的逻辑是在手机满电的情况下, 可以直接使用电池壳的电量)

iPhone智能充电壳在用iPhone7的时候就已经特别想入了, 但是当时使用的是7 Plus版本, 苹果并没有推出plus版的充电壳, 所以只能作罢.在19年底用iPhone 7 plus置换了iPhone 11, 第11代iPhone的续航是非常棒的, 但是我依然决定买智能充电壳, 在年前到手.

继续阅读