当前位置: 首页 > news >正文

北京视频直播网站建设/深圳seo优化方案

北京视频直播网站建设,深圳seo优化方案,做网站 博客,做网站购买服务器最后更新于2023年3月1日 10:23:13 参考的这个文章:https://martinfowler.com/eaaDev/EventSourcing.html 用C sharp实现的,我改写成Golang了 最简单的例子 func main() {eProc : NewEventProcessor()//refact : Cargo{Name: "Refactoring"}…

最后更新于2023年3月1日 10:23:13

参考的这个文章:https://martinfowler.com/eaaDev/EventSourcing.html
用C sharp实现的,我改写成Golang了

最简单的例子

func main() {eProc := NewEventProcessor()//refact := Cargo{Name: "Refactoring"}kr := &Ship{Name: "King Roy"}sfo := &Port{Name: "San Francisco", Country: "US"}//la := Port{Name: "Los Angeles", Country: "US"}//yyv := Port{Name: "Vancouver", Country: "Canada"}// Test 1ev := ArrivalEvent{DomainEvent: DomainEvent{Recorded: time.Now(),Occurred: time.Date(2005, time.November, 1, 0, 0, 0, 0, time.Local),},Port: sfo,Ship: kr,}eProc.Process(&ev)jiayulog.Logger.DebugP(sfo)jiayulog.Logger.DebugP(kr.Port)pretty.Log(eProc)
}

这里面的jiayulog是我自己搞了一个log,pretty-print结构体,用fmt.Print来代替就行。
首先main函数,定义了一艘船"King Roy"号,还有几个港口,这个例子里面就用了一个旧金山。
定义了一个到达事件,大概就是King Roy号在2005年到达了旧金山港口,这件事记录于time.Now()这个时刻。
把这个事情扔进事件处理器EventProcessor里面处理一下(更新Ship, Port等实体、记录日志)

// EventLog
type EventLog struct {ls []EventBase
}func (i *EventLog) Add(e EventBase) {i.ls = append(i.ls, e)
}// EventProcessor
type EventProcessor struct {log EventLog
}func NewEventProcessor() *EventProcessor {return &EventProcessor{log: EventLog{ls: make([]EventBase, 0)},}
}func (i *EventProcessor) Process(e EventBase) {e.Process()i.log.Add(e)
}

上面这个是事件处理器+事件日志,eventProcessor.Process方法里,首先让传进来的event调用自己的process方法,然后添加日志;
事件日志很简单,就是一个切片,一直往里面append就可以了,这个可以持久化到数据库里面。

// ArrivalEvent
type ArrivalEvent struct {DomainEventPort *PortShip *Ship
}func (i *ArrivalEvent) Process() {i.Ship.HandleArrival(*i)
}// DepartureEvent
type DepartureEvent struct {DomainEventPort *PortShip *Ship
}func (i *DepartureEvent) Process() {i.Ship.HandleDeparture(*i)
}// DomainEvent
type DomainEvent struct {Recorded time.TimeOccurred time.Time
}type EventBase interface {Process()
}

然后是实现了一个EventBase接口,下面有两种不同的event,到达event+出发event。在各自的Process方法里面调用Ship的处理方法,这里把整个event当做参数传进handle*方法里面i.Ship.HandleDeparture(*i),就很怪,不知道这样写好不好……

var PortAtSea = &Port{Name:    "AT_SEA",Country: "N/A",
}// Entities
type Ship struct {Name   stringPort   *PortCargos []Cargo
}func (i *Ship) HandleArrival(ev ArrivalEvent) {i.Port = ev.Portfor _, c := range i.Cargos {c.HandleArrival(ev)}
}func (i *Ship) HandleDeparture(ev DepartureEvent) {i.Port = PortAtSea
}type Port struct {Name    stringCountry string
}// Cargo
type Cargo struct {Name            string
}

再接着是一些实体类,船、港口、货物。需要注意的是船出发了它就在海上了,port这里就用一个PortAtSea表示没有停靠任何港口。
注意!!!HandleArrivel和HandleDeparture相当于把一个event传递进实体里面了!!!这是设计的思路!!!学吧老哥!!!

深入一点:我们的货物是否经过了加拿大

加拿大是tm挺危险,俺们那边老有人一不小心就自驾到温莎了,毕竟就是过条河的距离,习惯了。

// Cargo
type Cargo struct {Name            stringHasBeenInCanada bool
}func (i *Cargo) HandleArrival(ev ArrivalEvent) {if ev.Port.Country == "Canada" {i.HasBeenInCanada = true}
}

把上面提到的cargo这个实体改一改,做点判断。

func (i *Ship) HandleLoad(ev LoadEvent) {for _, c := range i.Cargos {if c.Name == ev.Cargo.Name {panic("重复的货物我不接,这不是数据结构和算法,不要考虑特殊情况")}}i.Cargos = append(i.Cargos, ev.Cargo)
}func (i *Ship) HandleUnload(ev UnloadEvent) {// Suppose that there must have available cargo at the ship.for index, c := range i.Cargos {if c.Name == ev.Cargo.Name {i.Cargos = append(i.Cargos[1:index], i.Cargos[index+1:]...)break}}
}

Ship也要改一改,加上装卸货的方法。

// LoadEvent
type LoadEvent struct {DomainEventCargo *CargoShip  *Ship
}func (i *LoadEvent) Process() {i.Ship.HandleLoad(*i)
}// UnloadEvent
type UnloadEvent struct {DomainEventCargo *CargoShip  *Ship
}func (i *UnloadEvent) Process() {i.Ship.HandleUnload(*i)
}

加上装卸货的事件。

func TestCanada(t *testing.T) {eProc := NewEventProcessor()refact := &Cargo{Name: "Refactoring"}kr := &Ship{Name: "King Roy"}sfo := &Port{Name: "San Francisco", Country: "US"}la := &Port{Name: "Los Angeles", Country: "US"}yyv := &Port{Name: "Vancouver", Country: "Canada"}eProc.Process(&LoadEvent{DomainEvent: DomainEvent{Recorded: time.Now(),Occurred: time.Date(2005, time.November, 1, 0, 0, 0, 0, time.Local),},Cargo: refact,Ship:  kr,})eProc.Process(&DepartureEvent{DomainEvent: DomainEvent{Recorded: time.Now(),Occurred: time.Date(2005, time.November, 1, 0, 0, 0, 0, time.Local),},Port: la,Ship: kr,})eProc.Process(&ArrivalEvent{DomainEvent: DomainEvent{Recorded: time.Now(),Occurred: time.Date(2005, time.November, 2, 0, 0, 0, 0, time.Local),},Port: yyv,Ship: kr,})eProc.Process(&DepartureEvent{DomainEvent: DomainEvent{Recorded: time.Now(),Occurred: time.Date(2005, time.November, 3, 0, 0, 0, 0, time.Local),},Port: yyv,Ship: kr,})eProc.Process(&ArrivalEvent{DomainEvent: DomainEvent{Recorded: time.Now(),Occurred: time.Date(2005, time.November, 4, 0, 0, 0, 0, time.Local),},Port: sfo,Ship: kr,})eProc.Process(&UnloadEvent{DomainEvent: DomainEvent{Recorded: time.Now(),Occurred: time.Date(2005, time.November, 4, 0, 0, 0, 0, time.Local),},Cargo: refact,Ship:  kr,})fmt.Println(refact.HasBeenInCanada)
}

整体流程是这样的:先在LA装上货,去温哥华兜一圈,再回旧金山卸货。因为温哥华在加拿大,所以refact.HasBeenInCanada字段为真。

相关文章:

一个关于事件溯源Event Sourcing的小荔枝,Golang实现

最后更新于2023年3月1日 10:23:13 参考的这个文章:https://martinfowler.com/eaaDev/EventSourcing.html 用C sharp实现的,我改写成Golang了 最简单的例子 func main() {eProc : NewEventProcessor()//refact : Cargo{Name: "Refactoring"}…...

Vue3 组合式函数,实现minxins

截至目前,组合式函数应该是在VUE 3应用程序中组织业务逻辑最佳的方法。它让我们可以把一些小块的通用逻辑进行抽离、复用,使我们的代码更易于编写、阅读和维护。 一. 什么是“组合式函数”? 根据官方文档说明,在 Vue 应用的概念中…...

什么是钉钉消息推送?

我是3y,一年CRUD经验用十年的markdown程序员👨🏻‍💻常年被誉为职业八股文选手 在前阵子我就已经接入了钉钉的群机器人和工作消息推送,一直没写文章同步到给大家。 像这种接入渠道的工作,虽然我没接入过&…...

利用 NVIDIATAO 和 WeightBias 加速AI开发

利用 NVIDIATAO 和 Weight&Bias 加速AI开发 利用图像分类、对象检测、自动语音识别 (ASR) 和其他形式的 AI 可以推动公司和商业部门内部的大规模转型。 然而,从头开始构建人工智能和深度学习模型是一项艰巨的任务。 构建这些模型的一个共同先决条件是拥有大量高…...

token - 令牌

文章目录token - 令牌学前须知:1,base64 防君子不防小人2,SHA-256 安全散列算法的一种(hash)3,HMAC-SHA2564,RSA256 非对称加密2.1 JWT - json-web-token1,三大组成2,jwt…...

应用模型开发指南上新介绍

Module、HAP、Ability、AbilitySta-ge、Context……您是否曾经被这些搞不懂又绕不开的知识点困扰? 现在,全新的《应用程序包基础知识》及《应用模型开发指南》为您答疑解惑! 这里有您关注的概念解析、原理机制阐述,也有丰富的…...

Dbeaver连接Hive数据库操作指导

背景:由于工作需要,当前分析研究的数据基于Hadoop的Hive数据库中,且Hadoop服务端无权限进行操作且使用安全模式,在研究了Dbeaver、Squirrel和Hue三种连接Hive的工具,在无法绕开useKey认证的情况下,只能使用…...

【RabbitMQ笔记09】消息队列RabbitMQ之常见方法的使用

这篇文章,主要介绍消息队列RabbitMQ之常见方法的使用。 目录 一、消息队列常见方法 1.1、连接工厂ConnectionFactory 1.2、连接Connection 1.3、通道Channel 1.4、交换机相关方法 (1)exchangeDeclare()声明交换机 1.5、队列相关方法 …...

Linux字符设备驱动模型之设备号

从上文中可知,在Linux用户空间中,如若需要操作硬件设备,均通过/dev目录下的设备文件节点进行操作,基本上每一种设备都会存在一个或者多个的设备节点。 并且在Linux内核中,其表示字符设备的结构成员也提供了相应的设备号…...

C++多态原理

请看下面的程序&#xff0c;该程序演示了多态类对象存储空间的大小。 #include <iostream> using namespace std; class A {public:int i;virtual void func() {}virtual void func2() {} }; class B : public A {int j;void func() {} }; int main() {cout << si…...

PMP认证与NPDP认证哪个含金量高?

两个证涉及的领域不一样的&#xff0c;一个是项目管理&#xff0c;对应的是项目经理&#xff1b;一个是产品管理&#xff0c;对应的是产品经理。含金量不能相比&#xff0c;但在各自的领域的含金量是很高的&#xff0c;至少专业程度或者知名度是最高的。 我来分别说一下PMP认证…...

改进YOLOv7-Tiny系列:首发改进结合BiFPN结构的特征融合网络,网络融合更多有效特征,高效涨点

💡该教程为改进进阶指南,属于《芒果书》📚系列,包含大量的原创首发改进方式, 所有文章都是全网首发原创改进内容🚀 内容出品:CSDN博客独家更新 @CSDN芒果汁没有芒果 💡本篇文章 基于 YOLOv5、YOLOv7芒果改进YOLO系列:芒果改进YOLOv7-Tiny系列:首发改进结合BiFPN结…...

PPC Insights系列:洞见安全多方图联邦

开放隐私计算开放隐私计算开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神&#xff0c;专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播&#xff0c;愿成为中国 “隐私计算最后一公里的服务区”。183篇原创内容公众号知…...

SQLite注入记录(目前最全、核心函数用法、布尔盲注、时间盲注、webshell、动态库,绕过方式)

目录 与Mysql区别 全部核心函数 普通注入 查询所有列 查看所有表名...

Java简单的生成/解析二维码(zxing qrcode)

Hi I’m Shendi Java简单的生成/解析二维码&#xff08;zxing qrcode&#xff09; 在之前使用 qrcode.js 方式生成二维码&#xff0c;但在不同设备上难免会有一些兼容问题&#xff0c;于是改为后端&#xff08;Java&#xff09;生成二维码图片 这里使用 Google 的 zxing包 Jar…...

若依项目导出后端响应的Excel文件流处理

若依开源项目&#xff1a;http://doc.ruoyi.vip/ruoyi-vue 问题 前端 1. download.js 添加自定义方法 /*** 自定义方法&#xff1a;导出后端响应的 excel 文件流* param url 请求后端的接口地址 例如&#xff1a;"/downloadExcel"* param name 响应后的文件名称&…...

华为OD机试【独家】提供C语言题解 - 数组排序

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明数组…...

JVM详解——内存结构

文章目录内存结构1、 运行时数据区2、虚拟机栈3、本地方法栈4、程序计数器5、 堆6、方法区7、运行时常量池8、内存溢出和内存泄漏9、 堆溢出内存结构 1、 运行时数据区 Java虚拟机在运行Java程序期间将管理的内存划分为不同的数据区&#xff0c;不同的区域负责不同的职能&…...

Jvisualvm监控Tomcat以及相关参数优化

Tomcat阻塞模式 阻塞模式&#xff08;BIO&#xff09; 客户端和服务器创建一个连接&#xff0c;它就会创建一个线程来处理这个连接&#xff0c;以为这客户端创建了几个连接&#xff0c;服务端就需要创建几个线程来处理你&#xff0c;导致线程会产生很多&#xff0c;有很多线程…...

界面组件DevExpress WinForms v22.2 - 全面升级数据展示功能

DevExpress WinForms拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜…...

正点原子第一期

ZYNQ是一个fpga用来硬件编程&#xff0c;外加一个软件编程 FPGA是可通过编程来修改其逻辑功能的数字集成电路 第三篇语法篇 第七章 verilog HDL语法 Verilog的简介 可编程逻辑电路&#xff1a;允许用户自行修改内部连接的集成电路&#xff0c;其内部的电路结构可以通过编程数…...

「mysql是怎样运行的」第24章 一条记录的多幅面孔---事务的隔离级别与MVCC

「mysql是怎样运行的」第24章 一条记录的多幅面孔—事务的隔离级别与MVCC 文章目录「mysql是怎样运行的」第24章 一条记录的多幅面孔---事务的隔离级别与MVCC一、事前准备二、事务的隔离级别事务并发执行遇到的问题SQL标准中的四种隔离级别MySQL中支持的四种隔离级别三、MVCC原…...

入门Java第十五天 线程

一、多线程 1.1进程和线程 进程&#xff1a;进程就是操作系统中运行的每一个应用程序。例如&#xff1a;微信&#xff0c;QQ 线程&#xff1a;线程是进程中的每一个任务。 多线程&#xff1a;在一个进程中&#xff0c;可以同时执行多个线程。同时完成多个任务。 并发&#x…...

探索用卷积神经网络实现MNIST数据集分类

问题对比单个全连接网络&#xff0c;在卷积神经网络层的加持下&#xff0c;初始时&#xff0c;整个神经网络模型的性能是否会更好。方法模型设计两层卷积神经网络&#xff08;包含池化层&#xff09;&#xff0c;一层全连接网络。选择 5 x 5 的卷积核&#xff0c;输入通道为 1&…...

MySQL 索引失效场景

1&#xff0c;前言 索引主要是为了提高表的查询速率&#xff0c;但在某些情况下&#xff0c;索引也会失效的情况。 2&#xff0c;失效场景 2.1 最左前缀法则 查询从索引最左列开始&#xff0c;如果跳过索引中的age列&#xff0c;那么age后面字段的索引都将失效&#xff0c;…...

Xcode开发工具,图片放入ios工程

Xcode开发工具&#xff0c;图片放入ios工程&#xff0c;有三种方式&#xff1a; 一&#xff1a;Assets Assets.xcassets 一般是以蓝色的Assets.xcassets的文件夹形式在工程中&#xff0c;以Image Set的形式管理。当一组图片放入的时候同时会生成描述文件Contents.jso…...

操作系统权限提升(十九)之Linux提权-SUID提权

系列文章 操作系统权限提升(十八)之Linux提权-内核提权 SUID提权 SUID介绍 SUID是一种特殊权限&#xff0c;设置了suid的程序文件&#xff0c;在用户执行该程序时&#xff0c;用户的权限是该程序文件属主的权限&#xff0c;例如程序文件的属主是root&#xff0c;那么执行该…...

直播 | StarRocks 实战系列第三期--StarRocks 运维的那些事

2023 年开春&#xff0c; StarRocks 社区重磅推出入门级实战系列直播&#xff0c;手把手带你从 Zero to Hero 成为一个 “StarRocks Pro”&#xff01;通过实际操作和应用场景的结合&#xff0c;我们将帮你系统性地学习 StarRocks 这个当今最热门的开源 OLAP 数据库。本次&…...

KingabseES执行计划-分区剪枝(partition pruning)

概述 分区修剪(Partition Pruning)是分区表性能的查询优化技术 。在分区修剪中&#xff0c;优化器分析SQL语句中的FROM和WHERE子句&#xff0c;以在构建分区访问列表时消除不需要的分区。此功能使数据库只能在与SQL语句相关的分区上执行操作。 参数 enable_partition_pruning 设…...

Operator-sdk 在 KaiwuDB 容器云中的使用

一、使用背景KaiwuDB Operator 是一个自动运维部署工具&#xff0c;可以在 Kubernetes 环境上部署 KaiwuDB集群&#xff0c;借助 Operator 可实现无缝运行在公有云厂商提供的 Kubernetes 平台上&#xff0c;让 KaiwuDB 成为真正的 Cloud-Native 数据库。使用传统的自动化工具会…...