Go语言的 的设计模式(Design Patterns)核心知识
Go语言的设计模式(Design Patterns)核心知识
Go语言(Golang)是一种静态类型、编译型的编程语言,自2009年由Google正式推出以来,因其高效的性能、卓越的并发能力以及简洁的语法受到广泛欢迎。在软件开发中,设计模式提供了一种解决常见问题的优雅方式。本文将深入探讨Go语言中的核心设计模式,包括它们的定义、实现以及在Go中应用的最佳实践。
设计模式的基本概念
设计模式是一组被反复使用的、面向对象的设计解决方案。它们并不是可以直接转化为代码的完整程序,而是提供了一种解决特定类型问题的思路和方法。设计模式通常分为三大类:
- 创建型模式(Creational Patterns):用于创建对象的模式,旨在提高对象创建的灵活性和可复用性。
- 结构型模式(Structural Patterns):用于处理类和对象之间的组合,帮助设计出更灵活的系统。
- 行为型模式(Behavioral Patterns):处理对象之间的交互和责任分配,旨在让系统中的对象能更好地协作。
接下来,我们将具体分析这些模式在Go语言中的实现。
创建型模式
1. 单例模式(Singleton Pattern)
单例模式确保一个类只有一个实例,并提供一个全局访问点。在Go中,我们通常使用sync.Once来实现单例。
```go package singleton
import ( "sync" )
type Singleton struct { // Fields here }
var instance *Singleton var once sync.Once
func GetInstance() *Singleton { once.Do(func() { instance = &Singleton{} }) return instance } ```
应用场景: - 配置管理。 - 连接池。
2. 工厂方法模式(Factory Method Pattern)
工厂方法模式定义一个创建对象的接口,让子类决定实例化哪一个类。Go中的接口可以很好地支持这个模式。
```go package factory
type Product interface { Use() string }
type ConcreteProductA struct{}
func (p *ConcreteProductA) Use() string { return "Using Product A" }
type ConcreteProductB struct{}
func (p *ConcreteProductB) Use() string { return "Using Product B" }
type Creator interface { FactoryMethod() Product }
type ConcreteCreatorA struct{}
func (c *ConcreteCreatorA) FactoryMethod() Product { return &ConcreteProductA{} }
type ConcreteCreatorB struct{}
func (c *ConcreteCreatorB) FactoryMethod() Product { return &ConcreteProductB{} } ```
应用场景: - 当需要创建复杂对象的同时希望将对象的创建过程与使用过程分开。
3. 抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式提供一个接口,用于创建一系列相关或相互依赖的对象,而不需要指定它们具体的类。
```go package abstractfactory
type AbstractProductA interface { Use() string }
type AbstractProductB interface { Use() string }
type ConcreteProductA1 struct{}
func (p *ConcreteProductA1) Use() string { return "Using Product A1" }
type ConcreteProductB1 struct{}
func (p *ConcreteProductB1) Use() string { return "Using Product B1" }
type AbstractFactory interface { CreateProductA() AbstractProductA CreateProductB() AbstractProductB }
type ConcreteFactory1 struct{}
func (f *ConcreteFactory1) CreateProductA() AbstractProductA { return &ConcreteProductA1{} }
func (f *ConcreteFactory1) CreateProductB() AbstractProductB { return &ConcreteProductB1{} } ```
应用场景: - 在需要创建一组相关对象时非常有用,如图形界面(GUI)框架中的按钮和文本框。
结构型模式
4. 适配器模式(Adapter Pattern)
适配器模式允许不兼容的接口之间工作。它的目的是提供一个兼容的接口,以便与现有的代码集成。
```go package adapter
type Target interface { Request() string }
type Adaptee struct{}
func (a *Adaptee) SpecificRequest() string { return "Specific Request" }
type Adapter struct { adaptee *Adaptee }
func (a *Adapter) Request() string { return a.adaptee.SpecificRequest() } ```
应用场景: - 将第三方库集成到现有应用程序中。
5. 装饰器模式(Decorator Pattern)
装饰器模式通过将一个对象包装在一个类里面,以增强或改变其行为。
```go package decorator
type Component interface { Operation() string }
type ConcreteComponent struct{}
func (c *ConcreteComponent) Operation() string { return "Concrete Component" }
type Decorator struct { component Component }
func (d *Decorator) Operation() string { return "Decorator(" + d.component.Operation() + ")" } ```
应用场景: - 动态地添加功能或者行为,而不修改现有的类。
6. 代理模式(Proxy Pattern)
代理模式为一个对象提供一个代理,以控制对该对象的访问。Go中的方法可以被封装在代理中,以便于管理。
```go package proxy
type Subject interface { Request() string }
type RealSubject struct{}
func (r *RealSubject) Request() string { return "Real Subject" }
type Proxy struct { subject Subject }
func (p *Proxy) Request() string { return "Proxy(" + p.subject.Request() + ")" } ```
应用场景: - 懒加载、访问控制、远程代理等。
行为型模式
7. 策略模式(Strategy Pattern)
策略模式允许在运行时选择算法的行为。
```go package strategy
type Strategy interface { DoOperation(int, int) int }
type AddStrategy struct{}
func (s *AddStrategy) DoOperation(a int, b int) int { return a + b }
type Context struct { strategy Strategy }
func (c *Context) SetStrategy(strategy Strategy) { c.strategy = strategy }
func (c *Context) ExecuteStrategy(a int, b int) int { return c.strategy.DoOperation(a, b) } ```
应用场景: - 当需要在运行时选择算法或行为时非常有用。
8. 观察者模式(Observer Pattern)
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象。
```go package observer
type Observer interface { Update(string) }
type Subject struct { observers []Observer }
func (s *Subject) Register(observer Observer) { s.observers = append(s.observers, observer) }
func (s *Subject) Notify(data string) { for _, observer := range s.observers { observer.Update(data) } } ```
应用场景: - 当对象之间存在一对多的关系时,如事件处理。
9. 迭代器模式(Iterator Pattern)
迭代器模式提供一种方法顺序访问一个集合对象中的各个元素,而不暴露该对象的内部表示。
```go package iterator
type Iterator interface { HasNext() bool Next() interface{} }
type Collection interface { CreateIterator() Iterator }
type ConcreteCollection struct { items []interface{} }
func (c *ConcreteCollection) CreateIterator() Iterator { return &ConcreteIterator{collection: c, index: 0} }
type ConcreteIterator struct { collection *ConcreteCollection index int }
func (i *ConcreteIterator) HasNext() bool { return i.index < len(i.collection.items) }
func (i *ConcreteIterator) Next() interface{} { item := i.collection.items[i.index] i.index++ return item } ```
应用场景: - 当需要遍历一个集合时。
总结
在Go语言中,每种设计模式都有其适用的场景和优势。通过使用设计模式,我们可以提高代码的复用性、可维护性和可扩展性。然而,设计模式并不是一种规则,而是一种指导方针。开发者在使用时应根据具体需求选择合适的设计模式。
理解和掌握这些设计模式,可以帮助Go开发者在面对复杂问题时保持简洁和清晰的代码结构,提高团队协作的效率,最终提升软件的质量。希望本文能为你在Go语言的学习和使用中提供一些有价值的参考。
相关文章:
Go语言的 的设计模式(Design Patterns)核心知识
Go语言的设计模式(Design Patterns)核心知识 Go语言(Golang)是一种静态类型、编译型的编程语言,自2009年由Google正式推出以来,因其高效的性能、卓越的并发能力以及简洁的语法受到广泛欢迎。在软件开发中&…...
js函数预览图片:支持鼠标和手势拖拽缩放
对之前的方式改进:原生js实现图片预览控件,支持丝滑拖拽,滚轮放缩,放缩聚焦_js图片预览-CSDN博客 /*** 图片预览函数,调用后自动预览图片* param {图片地址} imgurl*/ function openImagePreview(imgurl) {if (!imgurl…...
用QT实现 端口扫描工具1
安装在线QT,尽量是完整地自己进行安装,不然会少包 参考【保姆级图文教程】QT下载、安装、入门、配置VS Qt环境-CSDN博客 临时存储空间不够。 Windows系统通常会使用C盘来存储临时文件。 修改临时文件存储位置 打开系统属性: 右键点击“此电…...
设计模式 结构型 适配器模式(Adapter Pattern)与 常见技术框架应用 解析
适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口,从而使原本因接口不兼容而无法一起工作的类能够协同工作。这种设计模式在软件开发中非常有用,尤其是在需要集成…...
vue 项目集成 electron 和 electron 打包及环境配置
vue electron 开发桌面端应用 安装 electron npm i electron -D记得加上-D,electron 需添加到devDependencies,如果添加到dependencies后面运行可能会报错 根目录创建electron文件夹,在electron文件夹创建main.js(或者backgrou…...
vscode如何离线安装插件
在没有网络的时候,如果要安装插件,就会麻烦一些,需要通过离线安装的方式进行。下面记录如何在vscode离线安装插件。 一、下载离线插件 在一台能联网的电脑中,下载好离线插件,拷贝到无法联网的电脑上。等待安装。 vscode插件商店地址:https://marketplace.visualstudio.co…...
计算机网络常见面试题及解答
以下是计算机网络中常见的面试题及解答,按主题分类: --- ## **一、基础概念** ### **1. OSI 七层模型和 TCP/IP 模型的区别是什么?** **答:** - **OSI 七层模型:** - 应用层、表示层、会话层、传输层、网络层、数…...
举例说明AI模型怎么聚类,最后神经网络怎么保存
举例说明怎么聚类,最后神经网络怎么保存 目录 举例说明怎么聚类,最后神经网络怎么保存K - Means聚类算法实现神经元特征聚类划分成不同专家的原理和过程 特征提取: 首先,需要从神经元中提取有代表性的特征。例如,对于一个多层感知机(MLP)中的神经元,其权重向量可以作为特…...
HarmonyOS NEXT应用开发实战(一):边学边玩,从零开发一款影视APP
引言 学习一项技能,最好也最快的办法就是动手实战。通过自己给自己找项目练习,不仅能够激发兴趣,还能从开发实战中不断总结经验。这种学习方法是最为高效的。今天,我们将通过开发一款名为“爱影家”的影视APP,来学习H…...
STM32G0B1 can Error_Handler 解决方法
问题现象 MCU上电,发送0x13帧数据固定进入 Error_Handler 硬件介绍 MCU :STM32G0B1 can:NSI1042 tx 接TX RX 接RX 折腾了一下午,无解,问题依旧; 对比测试 STM32G431 手头有块G431 官方评估版CAN 模块; 同样的…...
使用 `llama_index` 构建智能问答系统:多种文档切片方法的评估
使用 llama_index 构建智能问答系统:多种文档切片方法的评估 代码优化与解析1. **代码结构优化**2. **日志管理**3. **环境变量管理**4. **模型初始化**5. **提示模板更新**6. **问答函数优化**7. **索引构建与查询引擎**8. **节点解析器测试** 总结 在现代自然语言…...
【大模型】7 天 AI 大模型学习
7 天 AI 大模型学习 Day 2 今天是 7 天AI 大模型学习的第二天 😄,今天我将会学习 Transformer 、Encoder-based and Decoder-Based LLMs 等 。如果有感兴趣的,就和我一起开始吧 ~ 课程链接 :2025年快速吃透AI大模型&am…...
软件工程大复习之(四)——面向对象与UML
4.1 面向对象概述 面向对象(OO)是一种编程范式,它将数据和处理数据的方法封装在对象中。面向对象的主要概念包括: 对象:实例化的数据和方法的集合。类:对象的蓝图或模板。封装:隐藏对象的内部…...
【Linux】shell命令
目录 shell的基本命令 shell - 贝壳 外在保护工具 用户、shell、内核、硬件之间的关系 解析器的分类: shell命令格式 history -历史记录查询 修改环境变量的值: shell中的特殊字符 通配符 管道 | 输入输出重定向 命令置换符 shell的基本命…...
ValuesRAG:以检索增强情境学习强化文化对齐
随着大型语言模型(LLMs)的迅猛发展,其在各个领域展现出强大的能力。然而,训练数据中西方中心主义的倾向,使得 LLMs 在文化价值观一致性方面面临严峻挑战,这一问题在跨文化场景中尤为突出,可能导…...
【机器学习篇】交通革命:机器学习如何引领未来的道路创新
嘿,你知道吗?机器学习正在交通领域掀起一场革命啦!它将如何引领未来道路创新呢 本文有精彩的 C 代码演示、实用的图片解释,还有超多干货,保证让你大开眼界,点赞收藏关注, 开启一场奇妙的探索之…...
DeepSeek-V3 通俗详解:从诞生到优势,以及与 GPT-4o 的对比
1. DeepSeek 的前世今生 1.1 什么是 DeepSeek? DeepSeek 是一家专注于人工智能技术研发的公司,致力于打造高性能、低成本的 AI 模型。它的目标是让 AI 技术更加普惠,让更多人能够用上强大的 AI 工具。 1.2 DeepSeek-V3 的诞生 DeepSeek-V…...
把vue项目或者vue组件发布成npm包或者打包成lib库文件本地使用
将vue项目发布成npm库文件,第三方通过npm依赖安装使用;使用最近公司接了一个项目,这个项目需要集成到第三方页面,在第三方页面点击项目名称,页面变成我们的项目页面;要求以npm库文件提供给他们;…...
【STC库函数】Compare比较器的使用
如果我们需要比较两个点的电压,当A点高于B点的时候我们做一个操作,当B点高于A点的时候做另一个操作。 我们除了加一个运放或者比较器,还可以直接使用STC内部的一个比较器。 正极输入端可以是P37、P50、P51,或者从ADC的十六个通道…...
单片机-独立按键矩阵按键实验
1、按键介绍 按键管脚两端距离长的表示默认是导通状态,距离短的默认是断开状态, 如果按键按下,初始导通状态变为断开,初始断开状态变为导通 我们开发板是采用软件消抖,一般来说一个简单的按键消抖就是先读取按键的状…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
