责任链(Chain)
提示
责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止
在责任链模式中,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,请求会自动进行传递。所以责任链将请求的发送者和请求的处理者解耦了
提示
责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止
在责任链模式中,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,请求会自动进行传递。所以责任链将请求的发送者和请求的处理者解耦了
提示
记录工作中遇到到 Seata 全局事务不回滚的问题
在工作中遇到需要调用其他服务接口,由于项目结构问题,没有使用其他的框架去调用接口,而是自己写 HTTP 请求接口调用
当我们复杂一个对象时,这个对象可以是内建数据类型,数组,结构体,map……我们在复制结构体的时候,当我们需要比较两个结构体中的数据是否相同时,我们需要使用深度比较,而不是只是简单地做浅度比较。这里需要使用到反射 reflect.DeepEqual()
,下面是几个示例
import (
"fmt"
"reflect"
)
type data struct {
}
func main() {
v1 := data{}
v2 := data{}
fmt.Println("v1 == v2:",reflect.DeepEqual(v1,v2))
//prints: v1 == v2: true
m1 := map[string]string{"one": "a","two": "b"}
m2 := map[string]string{"two": "b", "one": "a"}
fmt.Println("m1 == m2:",reflect.DeepEqual(m1, m2))
//prints: m1 == m2: true
s1 := []int{1, 2, 3}
s2 := []int{1, 2, 3}
fmt.Println("s1 == s2:",reflect.DeepEqual(s1, s2))
//prints: s1 == s2: true
}
在项目开发中,经常会遇到很多地方都需要获取当前的登录用户对象,根据请求的 session 或者 token 去获取用户信息,于是经常会在很多地方出现获取用户信息的代码
//根据token获取用户信息
String token = request.getHeader("token");
// 查询用户
User user = userService.getCurrentUser(token);
和 Java 语言一样,Go 也实现运行时反射,这为我们提供一种可以在运行时操作任意类型对象的能力。
在 go 语言中,实现反射能力的是 reflect
包,能够让程序操作不同类型的对象。其中,在反射包中有两个非常重要的 类型和 函数,两个函数分别是:
reflect.TypeOf
- 能获取对象的类型的信息reflect.ValueOf
- 能获取对象的数据提示
指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式
装饰器器的核心就是在 不改变原有类 的基础上给类新增功能
通常情况下,扩展一个类的功能会使用继承方式来实现。但继承具有静态特征,耦合度高,并且随着扩展功能的增多,子类会过多等问题。但是使用装饰器模式会是另外一种思路更为灵活,可以避免继承导致的子类过多
提示
设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案
使用设计模式的最终目的是 "高内聚低耦合"
转载自: Go slice扩容深度分析
参考资料:Go内存管理
提示
slice
使用时可以不用指定数组长度,超出长度也可以继续添加元素