天天看点

Golang学习笔记:体验函数闭包

最近闲来无事,即将毕业,把自己卖给了杭州的招银网络,正好利用这段时间可以好好学习以下Go语言。

从高中开始接触编程,当时还是用的Pascal语言,主要是为了参加信息竞赛,后来上了大学,大二开始学习Java便开始了我的Java旅程。到现在,已经用Java用了快六年了,前段时间找工作深深体会到了Java的美妙之处——需求量大。哈哈,相比实验室中用C/C++的小伙伴们,真的是太幸福了!!!

好基友本科毕业后就去了聚美优品,两年前就和我提到过Golang,说是很有前途,当时还没什么感觉,也就没有当回事。直到前段时间,听说B站和一些公司,后台系统用Golang重构了,加上区块链的出现,感觉未来即使Golang不是最屌的,也会是主流。

说实话,重新学习一门语言,说简单也简单,说不简单也不简单。最近主要就是跟着Go指南,一步步了解熟悉Go语言(还好没有忘干净C语言!!!)

指南中,前面的练习基本没什么难度,直到函数闭包这节。

利用函数闭包返回连续的斐波纳契数。

初始状态

package main

import "fmt"

// fibonacci 函数会返回一个返回 int 的函数。
func fibonacci() func() int {
}

func main() {
	f := fibonacci()
	for i := 0; i < 10; i++ {
		fmt.Println(f())
	}
}
           

看上去难度不大,我的思路是:维持一个长度为2的队列,每次返回就将队列中的两个数相加,并出队第一个数,结果再入队。

首先要解决的问题是:队列的实现。Java中有许多可以实现队列的工具,那么Go呢?万能的Google告诉我,可以用container/list实现队列。

list中的PushBack、Remove、Front都可以满足我的需求。

当我真正写的时候遇到一个比较尴尬的问题:list中元素都是Element类型,Go也没有像Java一样在创建list的时候指明元素的具体类型,而是采用了传说中的万能类型interface。

在我想要将两个元素做加法时,报错了:

cannot convert a.Value (type interface {}) to type int: need type assertion      

解决办法也很明确了:需要类型断言

通过Google发现,类型断言是Golang中解决这类问题的一种机制:A type assertion provides access to an interface value's underlying concrete value.类型断言机制提供了接口值到具体类型值的转化接口

对于我的需求,可以利用类型断言实现interface的值到int值的转换。

剩下的就是实现需求了

package main

import (
	"fmt"
	"container/list"
)

// fibonacci 函数会返回一个返回 int 的函数。
func fibonacci() func() int {
	fl:=list.New()
	fl.PushBack(int(0))
	fl.PushBack(int(0))
	return func() int {
		a:=fl.Front()
		fl.Remove(a)
		b:=fl.Front()
		tmp:=int(a.Value.(int))+int(b.Value.(int))//类型断言
		if tmp == 0{
			tmp =1;
		}
		fl.PushBack(tmp)
		return tmp;
	}
}

func main() {
	f := fibonacci()
	for i := 0; i < 10; i++ {
		fmt.Println(f())
	}
}
           

刚开始学习Go,其中有些概念可能理解的不对,希望大家帮忙指出!!!

版权声明:本文为CSDN博主「weixin_34295316」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_34295316/article/details/92557055