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

Go语言的 的设计模式(Design Patterns)核心知识

Go语言的设计模式(Design Patterns)核心知识

Go语言(Golang)是一种静态类型、编译型的编程语言,自2009年由Google正式推出以来,因其高效的性能、卓越的并发能力以及简洁的语法受到广泛欢迎。在软件开发中,设计模式提供了一种解决常见问题的优雅方式。本文将深入探讨Go语言中的核心设计模式,包括它们的定义、实现以及在Go中应用的最佳实践。

设计模式的基本概念

设计模式是一组被反复使用的、面向对象的设计解决方案。它们并不是可以直接转化为代码的完整程序,而是提供了一种解决特定类型问题的思路和方法。设计模式通常分为三大类:

  1. 创建型模式(Creational Patterns):用于创建对象的模式,旨在提高对象创建的灵活性和可复用性。
  2. 结构型模式(Structural Patterns):用于处理类和对象之间的组合,帮助设计出更灵活的系统。
  3. 行为型模式(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语言的设计模式&#xff08;Design Patterns&#xff09;核心知识 Go语言&#xff08;Golang&#xff09;是一种静态类型、编译型的编程语言&#xff0c;自2009年由Google正式推出以来&#xff0c;因其高效的性能、卓越的并发能力以及简洁的语法受到广泛欢迎。在软件开发中&…...

js函数预览图片:支持鼠标和手势拖拽缩放

对之前的方式改进&#xff1a;原生js实现图片预览控件&#xff0c;支持丝滑拖拽&#xff0c;滚轮放缩&#xff0c;放缩聚焦_js图片预览-CSDN博客 /*** 图片预览函数&#xff0c;调用后自动预览图片* param {图片地址} imgurl*/ function openImagePreview(imgurl) {if (!imgurl…...

用QT实现 端口扫描工具1

安装在线QT&#xff0c;尽量是完整地自己进行安装&#xff0c;不然会少包 参考【保姆级图文教程】QT下载、安装、入门、配置VS Qt环境-CSDN博客 临时存储空间不够。 Windows系统通常会使用C盘来存储临时文件。 修改临时文件存储位置 打开系统属性&#xff1a; 右键点击“此电…...

设计模式 结构型 适配器模式(Adapter Pattern)与 常见技术框架应用 解析

适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将一个类的接口转换成客户端所期望的另一个接口&#xff0c;从而使原本因接口不兼容而无法一起工作的类能够协同工作。这种设计模式在软件开发中非常有用&#xff0c;尤其是在需要集成…...

vue 项目集成 electron 和 electron 打包及环境配置

vue electron 开发桌面端应用 安装 electron npm i electron -D记得加上-D&#xff0c;electron 需添加到devDependencies&#xff0c;如果添加到dependencies后面运行可能会报错 根目录创建electron文件夹&#xff0c;在electron文件夹创建main.js&#xff08;或者backgrou…...

vscode如何离线安装插件

在没有网络的时候,如果要安装插件,就会麻烦一些,需要通过离线安装的方式进行。下面记录如何在vscode离线安装插件。 一、下载离线插件 在一台能联网的电脑中,下载好离线插件,拷贝到无法联网的电脑上。等待安装。 vscode插件商店地址:https://marketplace.visualstudio.co…...

计算机网络常见面试题及解答

以下是计算机网络中常见的面试题及解答&#xff0c;按主题分类&#xff1a; --- ## **一、基础概念** ### **1. OSI 七层模型和 TCP/IP 模型的区别是什么&#xff1f;** **答&#xff1a;** - **OSI 七层模型&#xff1a;** - 应用层、表示层、会话层、传输层、网络层、数…...

举例说明AI模型怎么聚类,最后神经网络怎么保存

举例说明怎么聚类,最后神经网络怎么保存 目录 举例说明怎么聚类,最后神经网络怎么保存K - Means聚类算法实现神经元特征聚类划分成不同专家的原理和过程 特征提取: 首先,需要从神经元中提取有代表性的特征。例如,对于一个多层感知机(MLP)中的神经元,其权重向量可以作为特…...

HarmonyOS NEXT应用开发实战(一):边学边玩,从零开发一款影视APP

引言 学习一项技能&#xff0c;最好也最快的办法就是动手实战。通过自己给自己找项目练习&#xff0c;不仅能够激发兴趣&#xff0c;还能从开发实战中不断总结经验。这种学习方法是最为高效的。今天&#xff0c;我们将通过开发一款名为“爱影家”的影视APP&#xff0c;来学习H…...

STM32G0B1 can Error_Handler 解决方法

问题现象 MCU上电&#xff0c;发送0x13帧数据固定进入 Error_Handler 硬件介绍 MCU :STM32G0B1 can:NSI1042 tx 接TX RX 接RX 折腾了一下午&#xff0c;无解&#xff0c;问题依旧&#xff1b; 对比测试 STM32G431 手头有块G431 官方评估版CAN 模块&#xff1b; 同样的…...

使用 `llama_index` 构建智能问答系统:多种文档切片方法的评估

使用 llama_index 构建智能问答系统&#xff1a;多种文档切片方法的评估 代码优化与解析1. **代码结构优化**2. **日志管理**3. **环境变量管理**4. **模型初始化**5. **提示模板更新**6. **问答函数优化**7. **索引构建与查询引擎**8. **节点解析器测试** 总结 在现代自然语言…...

【大模型】7 天 AI 大模型学习

7 天 AI 大模型学习 Day 2 今天是 7 天AI 大模型学习的第二天 &#x1f604;&#xff0c;今天我将会学习 Transformer 、Encoder-based and Decoder-Based LLMs 等 。如果有感兴趣的&#xff0c;就和我一起开始吧 &#xff5e; 课程链接 &#xff1a;2025年快速吃透AI大模型&am…...

软件工程大复习之(四)——面向对象与UML

4.1 面向对象概述 面向对象&#xff08;OO&#xff09;是一种编程范式&#xff0c;它将数据和处理数据的方法封装在对象中。面向对象的主要概念包括&#xff1a; 对象&#xff1a;实例化的数据和方法的集合。类&#xff1a;对象的蓝图或模板。封装&#xff1a;隐藏对象的内部…...

【Linux】shell命令

目录 shell的基本命令 shell - 贝壳 外在保护工具 用户、shell、内核、硬件之间的关系 解析器的分类&#xff1a; shell命令格式 history -历史记录查询 修改环境变量的值&#xff1a; shell中的特殊字符 通配符 管道 | 输入输出重定向 命令置换符 shell的基本命…...

ValuesRAG:以检索增强情境学习强化文化对齐

随着大型语言模型&#xff08;LLMs&#xff09;的迅猛发展&#xff0c;其在各个领域展现出强大的能力。然而&#xff0c;训练数据中西方中心主义的倾向&#xff0c;使得 LLMs 在文化价值观一致性方面面临严峻挑战&#xff0c;这一问题在跨文化场景中尤为突出&#xff0c;可能导…...

【机器学习篇】交通革命:机器学习如何引领未来的道路创新

嘿&#xff0c;你知道吗&#xff1f;机器学习正在交通领域掀起一场革命啦&#xff01;它将如何引领未来道路创新呢 本文有精彩的 C 代码演示、实用的图片解释&#xff0c;还有超多干货&#xff0c;保证让你大开眼界&#xff0c;点赞收藏关注&#xff0c; 开启一场奇妙的探索之…...

DeepSeek-V3 通俗详解:从诞生到优势,以及与 GPT-4o 的对比

1. DeepSeek 的前世今生 1.1 什么是 DeepSeek&#xff1f; DeepSeek 是一家专注于人工智能技术研发的公司&#xff0c;致力于打造高性能、低成本的 AI 模型。它的目标是让 AI 技术更加普惠&#xff0c;让更多人能够用上强大的 AI 工具。 1.2 DeepSeek-V3 的诞生 DeepSeek-V…...

把vue项目或者vue组件发布成npm包或者打包成lib库文件本地使用

将vue项目发布成npm库文件&#xff0c;第三方通过npm依赖安装使用&#xff1b;使用最近公司接了一个项目&#xff0c;这个项目需要集成到第三方页面&#xff0c;在第三方页面点击项目名称&#xff0c;页面变成我们的项目页面&#xff1b;要求以npm库文件提供给他们&#xff1b;…...

【STC库函数】Compare比较器的使用

如果我们需要比较两个点的电压&#xff0c;当A点高于B点的时候我们做一个操作&#xff0c;当B点高于A点的时候做另一个操作。 我们除了加一个运放或者比较器&#xff0c;还可以直接使用STC内部的一个比较器。 正极输入端可以是P37、P50、P51&#xff0c;或者从ADC的十六个通道…...

单片机-独立按键矩阵按键实验

1、按键介绍 按键管脚两端距离长的表示默认是导通状态&#xff0c;距离短的默认是断开状态&#xff0c; 如果按键按下&#xff0c;初始导通状态变为断开&#xff0c;初始断开状态变为导通 我们开发板是采用软件消抖&#xff0c;一般来说一个简单的按键消抖就是先读取按键的状…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...