最近闲来无事,即将毕业,把自己卖给了杭州的招银网络,正好利用这段时间可以好好学习以下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,其中有些概念可能理解的不对,希望大家帮忙指出!!!
有疑问加站长微信联系(非本文作者)