go语言读书笔记-action系列(一个简单的go程序)

action系列的书感觉还是挺经典的,入手后直接跳过第一章介绍,从第二章开始。在第二章中,其主要以一个搜索的小demo来整体回顾了下go的基础语法,以及鲜明特性,通道,携程之类的,顺读下来感觉对于之前读圣经积累下来的基础是一个十分不错的回顾。

快速开始一个go程序

书中的demo是一个从不同数据源中进行搜索的程序,其实现了json与rss这两种格式的读取与搜索,程序的整体架构如下:
image_1d4ku4v57nbldgti1b6eb1aok9.png-144.6kB
程序的目录结构分为data,matchers,search三个部分,main一贯作为程序的主入口执行整个程序。
从中get到的新的点,感觉就是对于init的使用,预先在各个包中初始化matcher的类型,感觉就像传统面向对象的初始化工厂对象一样。以及对于接口的绑定感觉很有意思,像php,java等对于接口都要使用关键字implements强实现,而go不同,任何一个struct只要绑定了对应方法那么就可以视为其实现了该对象就可以对其赋值,这种弱关联性,对于习惯了php,java那种写法的方式一开始kennel会感觉很不适应但是习惯了,真的感觉很nice,程序写起来就有种用最少的组件做最多的事情的感觉,唯一不爽的就还是觉得代码可读性,没java那么的高,也可能是我习惯了java。

接口的赋值

对于一个绑定方法结构体,如果其传入是值的话,则其接口引用类型无论是值还是指针都可以直接调用方法。如果传入的是指针的话,就只可以在接口引用类型是指针的情况下进行方法调用。举例如下:

1
2
3
4
5
6
7
8
9
10
11
12
// 方法声明为使用指向 defaultMatcher 类型值的指针作为接收者
func (m *defaultMatcher) Search(feed *Feed, searchTerm string)
// 通过 interface 类型的值来调用方法
var dm defaultMatcher
var matcher Matcher = dm // 将值赋值给接口类型 matcher.Search(feed, "test") // 使用值来调用接口方法
> go build
cannot use dm (type defaultMatcher) as type Matcher in assignment
// 方法声明为使用 defaultMatcher 类型的值作为接收者
func (m defaultMatcher) Search(feed *Feed, searchTerm string)
// 通过 interface 类型的值来调用方法
var dm defaultMatcher
var matcher Matcher = &dm // 将指针赋值给接口类型 matcher.Search(feed, "test") // 使用指针来调用接口方法