实验介绍

为了能更高效地使用语言进行编码,Go 语言有自己的哲学和编程习惯。Go 语言的设计者们从编程效率出发设计了这门语言,但又不会丢掉访问底层程序结构的能力。设计者们通过一组最少的关键字、内置的方法和语法,最终平衡了这两方面。Go 语言也提供了完善的标准库。标准库提供了构建实际的基于 Web 和基于网络的程序所需的所有核心库。 让我们通过一个完整的 Go 语言程序,来看看 Go 语言是如何实现这些功能的。这个程序实现的功能很常见,能在很多现在开发的 Go 程序里发现类似的功能。这个程序从不同的数据源拉取数据,将数据内容与一组搜索项做对比,然后将匹配的内容显示在终端窗口。这个程序会读取文本文件,进行网络调用,解码 XML 和 JSON 成为结构化类型数据,并且利用 Go 语言的并发机制保证这些操作的速度。

没必要第一次就读懂本章的所有内容,可以多读两遍。在学习时,虽然很多现代语言的概念可以对应到 Go 语言中,Go 语言还是有一些独特的特性和风格。如果放下已经熟悉的编程语言,用一种全新的眼光来审视 Go 语言,你会更容易理解并接受 Go 语言的特性,发现 Go 语言的优雅。

课程来源

本课程基于异步社区的《Go 语言实战》第 2 章制作,感谢异步社区授权实验楼发布。如需系统的学习本书,请购买《Go 语言实战》。

为了保证可以在实验楼环境中完成本次实验,我们在原书内容基础上补充了一系列的实验指导,比如实验截图,代码注释,帮助您更好得实战。

如果您对于实验有疑惑或者建议可以随时在讨论区中提问,与同学们一起探讨

知识点

  • 学习如何写一个复杂的 Go 程序
  • 声明类型、变量、函数和方法
  • 启动并同步操作 goroutine
  • 使用接口写通用的代码
  • 处理程序逻辑和错误

实验环境

Go 1.12
Xfce 终端

项目文件结构

在深入代码之前,让我们看一下程序的架构,看看如何在所有不同的数据源中搜索数据。
02 快速开始一个 Go 程序 - 图1

这个程序分成多个不同步骤,在多个不同的 goroutine 里运行。我们会根据流程展示代码,从主 goroutine 开始,一直到执行搜索的 goroutine 和跟踪结果的 goroutine,最后回到主 goroutine。
首先来看一下整个项目的结构:

  1. - sample
  2. - data
  3. data.json -- 包含一组数据源
  4. - matchers
  5. rss.go -- 搜索rss源的匹配器
  6. - search
  7. default.go -- 搜索数据用的默认匹配器
  8. feed.go -- 用于读取json数据文件
  9. match.go -- 用于支持不同匹配器的接口
  10. search.go -- 执行搜索的主控制逻辑
  11. main.go -- 程序的入口

这个应用的代码使用了 4 个文件夹,按字母顺序列出。文件夹 data 中有一个 JSON 文档,其内容是程序要拉取和处理的数据源。文件夹 matchers 中包含程序里用于支持搜索不同数据源的代码。目前程序只完成了支持处理 RSS 类型的数据源的匹配器。文件夹 search 中包含使用不同匹配器进行搜索的业务逻辑。最后,父级文件夹 sample 中有个 main.go 文件,这是整个程序的入口。 现在了解了如何组织程序的代码,可以继续探索并了解程序是如何工作的。让我们从程序的入口开始。

实验步骤

main 包

程序的主入口可以在 main.go 文件里找到,如代码清单 2-2 所示。虽然这个文件只有 21 行代码,依然有几点需要注意。

  • 代码清单 2-2 main.go ```go package main

import ( “log” “os”

  1. _ "github.com/goinaction/code/chapter2/sample/matchers"
  2. "github.com/goinaction/code/chapter2/sample/search"

)

// init is called prior to main. func init() { // Change the device for logging to stdout. log.SetOutput(os.Stdout) }

// main is the entry point for the program. func main() { // Perform the search for the specified term. search.Run(“president”) } ```