package main
import "fmt"
func main(){
fmt.Println("hello world")
}
01 package main
02
03 import (
04 "log"
05 "os"
06
07 _ "github.com/goinaction/code/chapter2/sample/matchers"
08 "github.com/goinaction/code/chapter2/sample/search"
09 )
10
11 // init 在 main 之前调用
12 func init() {
13 // 将日志输出到标准输出
14 log.SetOutput(os.Stdout)
15 }
16
17 // main 是整个程序的入口
18 func main() {
19 // 使用特定的项做搜索
20 search.Run("president")
21 }
这个包由 4 个不同的代码文件组成。每个文件对应一个独立的职责。
01 package search
02
03 import (
04 "log"
05 "sync"
06 )
07
08 // 注册用于搜索的匹配器的映射
09 var matchers = make(map[string]Matcher)
(log 包提供打印日志信息到标准输出(stdout)、标准错误(stderr)或者自定义设备的 功能。sync 包提供同步 goroutine 的功能。这个示例程序需要用到同步功能。)
第9行是全书第一次
以大写字母开头的标识符属于公开标识符,程序可以直接访问这个包中任意一个公开的标识符。而以小写字母开头的 标识符是不公开的,不能被其他包中的代码直接访问。但是,其他包可以间接访问不公开的标识 符。例如,一个函数可以返回一个未公开类型的值,那么这个函数的任何调用者,哪怕调用者不 是在这个包里声明的,都可以访问这个值。
这个变量声明还使用了赋值运算符和特殊的内置函数make初始化了变量(第9行)
func Run(searchTerm string){
}
Go语言使用关键词func声明函数,关键词后面紧跟着函数名、参数、以及返回值。
对于Run这个函数来说,只有一个参数,是string类型的,名为searchTerm。
13 // 获取需要搜索的数据源列表
14 feeds, err := RetrieveFeeds()
简化变量声明运算符只是一 种简化记法,让代码可读性更高。这个运算符声明的变量和其他使用关键字 var 声明的变量没 有任何区别。
根据经验,如果需要声明初始值为零值 的变量,应该使用 var 关键字声明变量;如果提供确切的非零值初始化变量或者使用函数返回 值创建变量,应该使用简化变量声明运算符。
22 // 构造一个 wait group,以便处理所有的数据源
23 var waitGroup sync.WaitGroup
24
25 // 设置需要等待处理
26 // 每个数据源的 goroutine 的数量
27 waitGroup.Add(len(feeds))
29 // 为每个数据源启动一个 goroutine 来查找结果
30 for _, feed := range feeds {
31 // 获取一个匹配器用于查找
32 matcher, exists := matchers[feed.Type]
33 if !exists {
34 matcher = matchers["default"]
35 }
36
37 // 启动一个 goroutine 来执行搜索
38 go func(matcher Matcher, feed *Feed) {
39 Match(matcher, feed, searchTerm, results)
40 waitGroup.Done()
41 }(matcher, feed)
42 }
如果仔细看一下第 30 行的 for range 语句,会发现再次使用了下划线标识符,这是第二次看到使用了下划线标识符。第一次是在 main.go 里导入 matchers 包的时候。这 次,下划线标识符的作用是占位符,占据了保存 range 调用返回的索引值的变量的位置。如果 要调用的函数返回多个值,而又不需要其中的某个值,就可以使用下划线标识符将其忽略。
+++
我们会在第 6 章进一步学习 goroutine,现在只要知道,一个 goroutine 是一个独立于其他函 数运行的函数。
使用关键字 go 启动一个 goroutine,并对这个 goroutine 做并发调度。
在第 41 行,matcher 和 feed 两个变量的值被传入匿名函数。在 Go 语言中,所有的变量 都以值的方式传递。因为指针变量的值是所指向的内存地址,在函数间传递指针变量,是在传递 这个地址值,所以依旧被看作以值的方式在传递。
39 Match(matcher, feed, searchTerm, results)
40 waitGroup.Done()
原文:https://www.cnblogs.com/Gumi-o/p/14546545.html