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、按键介绍 按键管脚两端距离长的表示默认是导通状态,距离短的默认是断开状态, 如果按键按下,初始导通状态变为断开,初始断开状态变为导通 我们开发板是采用软件消抖,一般来说一个简单的按键消抖就是先读取按键的状…...
python buildah
# 聊聊Python和Podman那点事儿 最近几年容器技术火得不行,Docker几乎成了标配。但如果你在Python开发圈子里待得够久,可能会注意到另一个名字开始频繁出现——Podman。这东西到底是个什么来头,和咱们Python开发又有什么关系?今天就…...
HarmonyOS6 半年磨一剑 - RcSlider 三方库插件 Tooltip 格式化与输入框联动实战案例集
前言 不知不觉件Rchoui 三方库组件的开发实战系列来到了最后一章节了,这个三方库组件整体来看是比较成功的,但是由于这个组件是个人开发的,因此存在多个瑕疵还请各位大佬多多包容 , 当前三方库已经完成了上架 Rchoui ,…...
2026届学术党必备的降AI率神器实际效果
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在学术写作以及内容创作里,存在着AI生成痕迹过高这样的痛点, 当前已然…...
如何高效使用Python-miio:5个实战场景完整指南
如何高效使用Python-miio:5个实战场景完整指南 【免费下载链接】python-miio Python library & console tool for controlling Xiaomi smart appliances 项目地址: https://gitcode.com/gh_mirrors/py/python-miio Python-miio是一个强大的开源工具&…...
三步实现Windows接收iPhone投屏:AirPlay2-Win完整使用指南
三步实现Windows接收iPhone投屏:AirPlay2-Win完整使用指南 【免费下载链接】airplay2-win Airplay2 for windows 项目地址: https://gitcode.com/gh_mirrors/ai/airplay2-win 还在为Windows电脑无法接收iPhone或iPad的屏幕镜像而烦恼吗?AirPlay2-…...
终极指南:如何用LayerDivider实现插画智能分层与PSD自动生成
终极指南:如何用LayerDivider实现插画智能分层与PSD自动生成 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 你是否曾经为了一张精美的插画需…...
PyQuery vs BeautifulSoup:哪个才是Python网页爬虫的最佳选择?
PyQuery vs BeautifulSoup:哪个才是Python网页爬虫的最佳选择? 【免费下载链接】pyquery A jquery-like library for python 项目地址: https://gitcode.com/gh_mirrors/py/pyquery 在Python网页爬虫领域,选择合适的解析库往往决定了开…...
免费开源歌词编辑器终极指南:5分钟掌握专业级LRC歌词制作
免费开源歌词编辑器终极指南:5分钟掌握专业级LRC歌词制作 【免费下载链接】lrc-maker 歌词滚动姬|可能是你所能见到的最好用的歌词制作工具 项目地址: https://gitcode.com/gh_mirrors/lr/lrc-maker 你是否曾经为音乐创作或翻唱作品制作歌词时&am…...
如何快速掌握SAM-HQ:从源码编译到自定义模块扩展的完整指南
如何快速掌握SAM-HQ:从源码编译到自定义模块扩展的完整指南 【免费下载链接】sam-hq Segment Anything in High Quality [NeurIPS 2023] 项目地址: https://gitcode.com/gh_mirrors/sa/sam-hq SAM-HQ(Segment Anything in High Quality࿰…...
G-Helper:华硕笔记本用户如何摆脱臃肿控制中心,实现轻量化硬件管理?
G-Helper:华硕笔记本用户如何摆脱臃肿控制中心,实现轻量化硬件管理? 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting ac…...
