Jeremyyip的Go语言学习系列
目的
通过这个项目,了解go语言的使用和功能:
一个程序的框架、执行流程;
go并发goroutine应用;
通道channel应用;
接口interface应用;
主旨并不是阅读弄懂代码,而是理解一个程序的概念和流程;代码讲解一时三刻也不是具体搞清楚,只作为一个入门前的感性认识,大概了解一下即可,待以后真的感兴趣开始学习Go语言后,可以回过来再仔细体会代码的内容;另外这里省略去概念的讲解,但是,需要大家去寻找和结合概念去理解。
应用实现
具体使用方法可以查考文章 “RSS网址匹配器搜索使用说明”。
代码已上传Git:https://github.com/YJeremy/RssFeed
技术实现
这个程序分有多个并发goroutine,在多个不同的goroutine里运行。从开始,一直执行到和,最后回到,程序结束。
代码文件夹路径结构
在scr文件夹里,如下:
src
main.go(main包)
上述代码还有一个包“matchers”没有用到,但是它前面有一个“_”号,表示自动使用该包里面的init函数;go语言里,若编译时候发现有多余的包没有使用,程序会报错;因此用“_”能够减低这个错误。
整个main函数包含程序核心业务逻辑,调用了search包的Run函数,需要传入一个字符串作为搜索项。一旦Run函数退出,程序就会终止。
每个init函数都会在main函数执行前调用。
search包
search.go
每个文件都以package关键字开头,随后跟包的名字。文件夹search下的每个代码文件都使用search作为包名。
代码标准库里的log和sync包。
编译器查找包总是会到GOROOT和GOPATH环境变量的位置查找。
match.go
函数func Match 、func Display 是因为 类型Result在这里定义;
实现 Matcher 接口定义;
函数Match实际是调用了Matcher接口方法,并对Result的处理统一存入通道处理;
Result参数由调用者在外部声明后调入;作为通道类型的参数处理方式;
feed.go
实现把我们准备好的JSON文件,进行解码。
JSON是一种文档格式,类似常见的txt、word、pdf,也是一种文件。
解码,类似word文档转pdf文档一样,我们JSON格式也要转成能够让Go语言读懂的格式。
为什么要有JSON格式?因为这是在众多编程语言中,约定的一种通用格式“之一”。另外还有xml格式等,都是用来存储信息用的。每种编程语言因此都有专门的解码函数,Go里的标准库就有 encoding/json 包,借来使用就好了。
default.go
实现一个默认匹配器,其实是一个空的匹配器。
只要满足接口的方法,该变量即可成为该接口类型。
方法内容不做要求,这里就全为空值;能让程序顺利执行下去,只不过并没有结果输出。
注意关于默认的变量设计。
matchers包
用于存放各种匹配器的包。
目前只有一种,即RSS匹配器,对应的是rss.go。
我们的Data文件夹里面的JSON文件,存放的网址也全是RSS类型的。
只要通过自动判断对应类型的网址,调用对应的匹配器,即可实现关键词查找、解析。
rss.go
rss类型的格式是按照xml格式保存的
rss的网址有固定的结构,因为我们比较容解析
类似上面feed.go里JSON文件的解码
类似上面的default 实现matcher接口
只是这里新增加从网上URL下载的功能。
下载->解码->查找文件中关键字->存入结果
既然只是实现match的方法和结果result的存入,那么matchers的本身类型并不重要,所以defualtMatcher、rssMatcher就使可自定义的结构类型struct,并且为空就可以了。
(完)
领取专属 10元无门槛券
私享最新 技术干货