1. 接口接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节。 1.1. 接口 1.1.1. 接口类型 在Go语言中接口(interface)是一种类型,一种抽象的类型。 interface是一组method的集合,是duck-type programming的一种体现。接口做的事情就像是定义一个协议(规则),只要一台机器有洗衣服和甩干的功能,我就称它为洗衣机。不关心属性(数据),只关心行为(方法)。 为了保护你的Go语言职业生涯,请牢记接口(interface)是一种类型。 1.1.2. 为什么要使用接口 type Cat struct{} func (c Cat) Say() string { return "喵喵喵" } type Dog struct{} func (d Dog) Say() string { return "汪汪汪" } func main() { c := Cat{} fmt.Println("猫:", c.Say()) d
1. 结构体Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念。Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性。 1.1. 类型别名和自定义类型 1.1.1. 自定义类型 在Go语言中有一些基本的数据类型,如string、整型、浮点型、布尔等数据类型,Go语言中可以使用type关键字来定义自定义类型。 自定义类型是定义了一个全新的类型。我们可以基于内置的基本类型定义,也可以通过struct定义。例如: //将MyInt定义为int类型 type MyInt int 通过Type关键字的定义,MyInt就是一种新的类型,它具有int的特性。 1.1.2. 类型别名 类型别名是Go1.9版本添加的新功能。 类型别名规定:TypeAlias只是Type的别名,本质上TypeAlias与Type是同一个类型。就像一个孩子小时候有小名、乳名,上学后用学名,英语老师又会给他起英文名,但这些名字都指的是他本人。 type TypeAlias = Type `
Elasticsearch学习笔记引言 在现代的Web应用中,数据检索是一个重要的部分。用户需要能够快速准确地找到他们想要的信息,而开发者需要提供强大的搜索功能来满足这个需求。这就是Elasticsearch发挥作用的地方。 Elasticsearch是一个基于Lucene库的开源搜索引擎。它提供了一个分布式、多租户的全文搜索引擎,具有HTTP Web接口和无模式JSON文档。Elasticsearch被设计为可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。 Elasticsearch基础 安装与配置 要在Rails项目中使用Elasticsearch,我们需要首先安装Elasticsearch服务和Ruby客户端库。 安装Elasticsearch服务 我们可以从Elasticsearch官网下载并安装适合我们操作系统的版本。 使用docker或者docker-compose部署Elasticsearch
状态模式引言 设计模式在面向对象编程中是一种常见且实用的策略,它们提供了解决软件设计中常见问题的经过验证的解决方案。状态模式是其中的一种行为设计模式,它允许一个对象在其内部状态改变时改变其行为。 状态模式在实际开发中非常有用,特别是当一个对象的行为取决于其状态,并且必须能够在运行时根据当前状态改变其行为。这种模式将与特定状态相关的行为封装在单独的类中,这样可以保持主对象代码的简洁,并提高代码的可维护性和灵活性。 状态模式结构 举例说明 账号登录 假设我们正在开发一个网站,用户需要登录才能访问某些页面。用户账号可能有多种状态,如未登录、已登录和已锁定。每种状态下,账号的行为都有所不同。 首先,我们定义一个AccountState抽象类,声明所有具体状态类需要实现的方法: class AccountState def handle(context)
装饰器模式引言 在软件开发中,设计模式是解决常见问题的经过验证的解决方案。其中,装饰器模式是一种非常有用的结构型设计模式,它允许我们动态地添加行为和责任到对象上,而不需要修改其代码。 装饰器模式的核心思想是将一个对象包装在另一个同样实现了该对象接口的对象(即装饰器)中。装饰器接收所有来自客户端的请求,并将这些请求转发给被包装的对象。然后,装饰器可以添加一些附加行为,比如在请求处理之前或之后执行一些操作。 装饰器模式结构 举例说明 咖啡店 假设我们正在运营一个咖啡店,有各种各样的咖啡可供选择。然后我们可以加入各种配料,如牛奶、摩卡、豆浆等。每加入一种配料,都会增加咖啡的价格。 首先,我们定义一个基础咖啡类: class Coffee def cost 2.00 end def description "Coffee" e
适配器模式引言 设计模式是软件工程中最重要和最实用的概念之一。它们提供了解决常见编程问题和挑战的经过验证的解决方案。其中一个最有用且广泛使用的设计模式是适配器模式。 适配器模式是一种结构型设计模式,它允许我们将一个类的接口转换为客户端期望的另一个接口。适配器允许类以兼容方式工作,这些类的接口可能不兼容。 在现实生活中,电源适配器是适配器模式的一个很好的例子。电源适配器有一个与电源插座兼容的一端,另一端则与特定设备(如笔记本电脑)兼容。适配器负责处理电压和电流的转换,使设备能够安全地使用电源。 在软件开发中,适配器模式用于解决类或模块之间接口不兼容问题。通过创建一个新的适配器类,将一个类的接口转换为另一个类可以理解和使用的接口。 适配器模式结构 举例说明 ActiveRecord ActiveRecord是Ruby on Rails框架中负责模型(MVC架构中的M部分
生成器模式引言 设计模式是一种在软件工程中解决常见问题的经过验证的解决方案。生成器模式是一种创建型设计模式,它提供了一种在不直接构造对象的情况下创建复杂对象的方法。 生成器模式通常用于创建具有多个可能配置选项的复杂对象。这些对象通常具有大量的构造参数,其中许多参数是可选的。生成器模式使得我们可以逐步构造这样的对象,只设置我们关心的属性,而忽略其他属性。 生成器模式由四个主要部分组成:产品(Product)、生成器(Builder)、具体生成器(ConcreteBuilder)和指挥者(Director)。产品是我们想要构造的复杂对象,生成器定义了创建产品所需的所有步骤,具体生成器实现了这些步骤,而指挥者负责使用生成器来构建产品。 生成器模式结构 举例说明 汽车制造 假设我们正在开发一个汽车制造系统,需要生产各种配置不同的汽车。每辆汽车都有很多可能配置选项,如颜色、引擎
工厂方法模式引言 设计模式是软件工程中的一种常见实践,它们提供了解决软件设计中常见问题的通用解决方案。其中一个最常用且实用的设计模式是工厂方法模式。 工厂方法模式是一种创建型设计模式,它提供了一种封装对象创建过程的方式。在工厂方法模式中,我们不直接使用 new 关键字来创建对象,而是通过一个工厂方法来创建对象。这样,我们可以在不改变代码的情况下更改所创建对象的类型。 工厂方法模式结构 举例说明 图形界面组件 假设我们正在开发一个跨平台的客户端软件,需要支持多种操作系统(如Windows、MacOS、Linux等)。每种操作系统都有自己独特的方式来创建和管理软件的窗口和控件,但我们希望能提供一个统一的接口来创建所有类型的组件。 首先,我们定义一个 Component 接口,它定义了所有组件必须实现的方法: module Component
前言Solr是一个基于Lucene的搜索平台,而Lucene是一个强大的全文搜索引擎库。Solr使用Lucene的倒排索引来实现高效的搜索功能。在Solr中,倒排索引由索引和查询两个主要部分组成。 索引 Solr的索引是倒排索引的实际存储。它包含了文档的词语信息、位置信息和其他相关的统计信息。索引的构建是一个离线的过程,当新文档加入时,Solr会更新索引以保持数据的一致性。 查询 查询是通过Solr API提交的搜索请求。Solr将查询解析为对倒排索引的检索操作,并返回匹配的文档及其相关信息。查询可以包括搜索关键词、过滤条件、排序规则等。 本次只研究solr的倒排索引部分。 Solr倒排索引的基本组成 Solr 中的倒排索引由以下三部分组成: 词典(Dictionary) 倒排列表(Postings) 频率/位置信息(Frequencies/Positions) 词典(Dictionary) 词典存储着所有文档中出现过的唯一词语,每个词语映射到一个数字化的词ID。 例如,假设存在以下3个文档:
前言当代互联网时代,信息爆炸式增长,如何高效地检索和管理海量数据成为一项关键任务。倒排索引(Inverted Index)作为一种常用的数据结构,被广泛应用于搜索引擎、数据库和信息检索系统中。在本篇博客总结中,我将详细介绍倒排索引的基本概念、构建过程以及应用场景,并通过示例和图片来解释相关概念。 正排索引和倒排索引 说到倒排索引,就不得不提一下正排索引。一个简单的例子: 当用户发起查询时(假设查询为一个关键词),搜索引擎会扫描索引库中的所有文档,找出所有包含关键词的文档,这样依次从文档中去查找是否含有关键词的方法叫做正排索引。互联网上存在的网页(或称文档)不计其数,这样遍历的索引结构效率低下,无法满足用户需求。 正排索引结构如下: 文档1的ID → 单词1的信息;单词2的信息;单词3的信息… 文档2的ID → 单词3的信息;单词2的信息;单词4的信息… ... 为了解决
Jack
新时代搬砖农民工~
加入书签
公告
网站资讯
运行时间:890天9时2分18秒
总访问量: 156091