创建型模式-单例模式
创建型模式-单例模式什么是单利模式单例是一种创建型设计模式, 让你能够保证一个类只有一个实例,并提供一个访问该 实例的全局节点 单例模式,一个类只有一个实例 为该实例提供一个全局访问节点 单例(Singleton)类声明了一个名为 getInstance 获取实 例 的静态方法来返回其所属类的一个相同实例。单例的构造函数必须对客户端(Client) 代码隐藏。 调用 获取实例 方法必须是获取单例对象的唯一方式。 Example简单单例123456789101112131415161718192021222324252627282930package mainimport ( "fmt" "sync")var lock = &sync.Mutex{}type single struct {}var singleInstance *singlefunc getInstance() *single { if singleInstance == nil ...
创建型模式-工厂方法
创建型模式-工厂方法什么是工厂方法工厂方法是一种创建型设计模式, 其在父类中提供一个创建对象的 方法,允许子类决定实例化对象 的类型 Example产品接口12345678package maintype IGun interface { setName(name string) setPower(power int) getName() string getPower() int} 具体产品A12345678910111213141516171819202122package maintype Gun struct { name string power int}func (g *Gun) setName(name string) { g.name = name}func (g *Gun) getName() string { return g.name}func (g *Gun) setPower(power int) { g...
创建型设计模式-抽象工厂
创建型设计模式-原型模式什么是原型模式原型是一种创建型设计模式,使 你能够复制已有对象,而又无需 使代码依赖它们所属的类 原型(Prototype)接口将对克隆方法进行声明。在绝大多数 情况下,其中只会有一个名为 clone 克隆 的方法 具体原型(Concrete Prototype)类将实现克隆方法。除了将 原始对象的数据复制到克隆体中之外,该方法有时还需处理 克隆过程中的极端情况,例如克隆关联对象和梳理递归依赖 等等 客户端(Client)可以复制实现了原型接口的任何对象 原型注册表(Prototype Registry)提供了一种访问常用原型 的简单方法,其中存储了一系列可供随时复制的预生成对象。 最简单的注册表原型是一个 名称 → 原型 的哈希表。 但如 果需要使用名称以外的条件进行搜索,你可以创建更加完善 的注册表版本 Example原型接口123456package maintype Inode interface { print(string) clone() Inode} 具体原型A1234567891011...
创建型设计模式-抽象工厂
创建型设计模式-抽象工厂什么是抽象工厂它能创建一系列相关的对象,而无需指定其具体类 抽象产品:为构成系列产品的一组不同但 相关的产品声明接口 具体产品(Concrete Product)是抽象产品的多种不同类型实 现。所有变体(维多利亚/现代)都必须实现相应的抽象产品 (椅子/沙发 抽象工厂(Abstract Factory)接口声明了一组创建各种抽象 产品的方法 具体工厂(Concrete Factory)实现抽象工厂的构建方法。每 个具体工厂都对应特定产品变体,且仅创建此种产品变体。 尽管具体工厂会对具体产品进行初始化,其构建方法签名必须返回相应的抽象产品。这样,使用工厂类的客户端代码就 不会与工厂创建的特定产品变体耦合。客户端(Client)只 需通过抽象接口调用工厂和产品对象,就能与任何具体工厂/ 产品变体交互 Example抽象工厂接口1234567891011121314151617181920package mainimport "fmt"type ISportsFactory interface &...
创建型设计模式-生成器模式
创建型设计模式-生成器模式什么是生成器模式使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象 生成器(Builder)接口声明在所有类型生成器中通用的产品 构造步骤 具体生成器(Concrete Builders)提供构造过程的不同实现。 具体生成器也可以构造不遵循通用接口的产品。 产品(Products)是最终生成的对象。由不同生成器构造的 产品无需属于同一类层次结构或接口。 主管(Director)类定义调用构造步骤的顺序,这样你就可以 创建和复用特定的产品配置。 客户端(Client)必须将某个生成器对象与主管类关联。一 般情况下,你只需通过主管类构造函数的参数进行一次性关 联即可。此后主管类就能使用生成器对象完成后续所有的构 造任务。但在客户端将生成器对象传递给主管类制造方法时 还有另一种方式。在这种情况下,你在使用主管类生产产品 时每次都可以使用不同的生成器 Example生成器接口12345678910111213141516171819package maintype IBuilder interface {...
Gorm-JSON格式问题
Gorm-JSON格式问题概述在使用Gorm的时候,常常会使用JSON格式,但是JSON在Gorm的ORM中表达有着许多解析问题 问题描述 []也是作为JSON格式的一种,里面可以切套object对象,但是实际上我们可以看作一个数组,这种时候 当我们使用 步骤建立表格12345678910111213141516171819202122type User struct { gorm.Model Name string Age int GameUser []GameUser `json:"game_user" gorm:"type:json"`}type GameUser struct { ID int Name string PassWord string}func main() { dsn := "root:123456@tcp(10.0.0.197:3303)/joohwan_dev?par...
设计模式-五大原则
设计模式-五大原则职责单一原则尽量让每个类只负责软件中的一个功能,并将该功能完全封 装(你也可称之为隐藏)在该类中。 开闭原则对于扩展,类应该是“开放”的;对于修改,类则应 是“封闭”的。 里氏替换原则当你扩展一个类时, 记住你应该要能在不修改客户端 代码的情况下将子类的对象作为父类对象进行传递。 接口隔离原则客户端不应被强迫依赖于其不使用的方法。 依赖倒置原则高层次的类不应该依赖于低层次的类。 两者都应该依赖于抽象接口。抽象接口不应依赖于具体实现。具体 实现应该依赖于抽象接口。
Gin中间件
Gorm:钩子HookHook 是在创建、查询、更新、删除等操作之前、之后调用的函数。 支持以下的Hook方法 1234567891011121314151617181920212223242526272829303132333435type BeforeCreateInterface interface { BeforeCreate(*gorm.DB) error}type AfterCreateInterface interface { AfterCreate(*gorm.DB) error}type BeforeUpdateInterface interface { BeforeUpdate(*gorm.DB) error}type AfterUpdateInterface interface { AfterUpdate(*gorm.DB) error}type BeforeSaveInterface interface { BeforeSave(*gor...
Go-标准库日志Slog
Go的标准库日志Slog背景在Go1.21中,在Go的标准库函数中引入了Slog 据说使用的内存比Zap还要小 基础用法12345678slog.Info("This is info log")slog.Warn("This is warning log")slog.Error("This is error log")日志输出:2024/07/23 15:26:01 INFO This is info log2024/07/23 15:26:01 WARN This is warning log2024/07/23 15:26:01 ERROR This is error log 输出参数的日志12345678 name := "sss" slog.Info("msg", slog.String("name", name)) slog.Error("ERROR: value is empty", slog.Any("name&qu...
K8s-自动伸缩
K8s-自动伸缩Pod的横向伸缩(水平拓展HPA)Pod的横向伸缩是通过控制器管理Pod的副本数实现的,由Horizontal控制器负责,通过HPA资源管理,调整Pod的数量 自动伸缩过程 获取被伸缩的对象的Pod度量 计算需要达到的Pod数量 更新replicas字段 基于CPU使用率进行自动伸缩CPU需要进行CPU高峰使用,进行HPA SHELL 12# CPU使用率到30的时候 进行伸缩 kubectl autoscale deploymengt kubia --cpu-percent=30 --min=l --max=5 YAML 1234567891011121314151617181920apiVersion: autoscaling/v2kind: HorizontalPodAutoscalermetadata: name: php-apachespec: # 指定的目标资源 scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: php-apache minRe...