关于go:带读-Go-in-Action中文Go语言实战二接口

39次阅读

共计 1206 个字符,预计需要花费 4 分钟才能阅读完成。

接口

接口的定义

这里用一个例子阐明了 golang 中接口的含意与用法,先看代码

        // Launch the goroutine to perform the search.
        go func(matcher Matcher, feed *Feed) {Match(matcher, feed, searchTerm, results)
            waitGroup.Done()}(matcher, feed)

下面这段代码是 search.go 中调用 Match 函数的代码,其中 Match 的第一个参数“matcher”就是接口定义如下:

// Matcher defines the behavior required by types that want
// to implement a new search type.
type Matcher interface {Search(feed *Feed, searchTerm string) ([]*Result, error)
}

通过这个接口,咱们的匹配器就能够用统一且通用的办法解决不同类型的匹配值,是不是很优雅

接口的命名

命名接口的时候,也须要恪守 Golang 的命名常规。如果接口类型只蕴含 一个办法,那么这个类型的名字以er 结尾。咱们的例子里就是这么做的,所以这个接口的名字叫作 Matcher。如果接口类型外部申明了多个办法,其名字须要与其行为关联。

类实现接口

这里提供一个最简略的这个接口的类的实现

package search

type defaultMatcher struct {
}

func (m defaultMatcher) Search(feed *Feed, searchTerm string) ([]*Result, error) {return nil, nil}

下面的代码有两点须要阐明:
1. 这个代码创立了一个类(defaultMatcher),这是一个空构造体,空构造体创立的时候零碎不会调配任何内存,不须要保护状态,只须要实现接口即可,故,空构造体很适宜创立没有任何状态的类型。
2.func 前面 Search 后面的这个括号的内容是指定接收者,说白了就是把接下来要写的函数绑定在指定的类上,相似 Java 的成员办法。

接口办法调用受限

因为大部分办法在被调用后都须要保护接收者的值的状态,所以,一个 最佳实际 是,将办法的接收者申明为 指针 。对于 defaultMatcher 类型来说,应用值作为接收者是因为创立一个 defaultMatcher 类型的值不须要分配内存。因为 defaultMatcher 不须要保护状态,所以不须要指针模式的接收者。
与间接通过值或者指针调用办法不同,如果通过接口类型的值调用办法,规定有很大不同,如代码清单 2 -38 所示。应用 指针 作为接收者申明的办法,只能在接口类型的值是一个 指针 的时候被调用。应用 作为接收者申明的办法,在接口类型的值为 或者 指针 时,都能够被调用。


参考:Kennedy W , Ketelsen B , Martin E S . Go in action. 2016.

正文完
 0