自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(46)
  • 收藏
  • 关注

原创 Java的23种设计模式

本文系统介绍了Java的23种经典设计模式,按创建型、结构型、行为型三大类分类说明。创建型模式(5种)如单例、工厂等,专注于对象创建过程的优化;结构型模式(7种)如适配器、装饰器等,解决类与对象的结构问题;行为型模式(11种)如观察者、策略等,处理对象间的交互逻辑。每种模式均包含核心思想与典型应用场景,并提供了模式选择的决策思路:根据问题类型(创建/结构/行为)匹配对应模式,考虑代码复用性、解耦需求等维度。全文以简洁方式呈现设计模式的精髓,帮助开发者快速理解各模式特点及适用场景。

2025-05-21 17:12:02 846

原创 Java设计模式-责任链模式(行为型)

责任链模式是一种行为设计模式,旨在将请求的处理者连成一条链,请求在链上传递,直到有一个对象能够处理它。这种模式的核心思想是解耦请求的发送者和接收者,使多个对象都有机会处理请求,从而提高系统的灵活性和可扩展性。 以公司请假审批为例,责任链模式通过定义处理者接口(Handler)和具体处理者类(如组长、经理、总经理),将审批流程逐级传递。员工提交请假请求后,请求会沿着责任链传递,直到找到有权限处理该请求的审批者。这种方式不仅降低了代码的耦合度,还使得审批流程的调整和扩展更加灵活。 在代码实现中,处理者接口定义了

2025-05-12 08:30:00 919

原创 Java设计模式-策略模式(行为型)

策略模式是一种行为型设计模式,通过将算法的定义与使用分离,将不同的算法封装成独立的策略类,客户端可以根据需求动态选择策略。该模式的核心思想是将算法的变化独立于使用它的客户端代码,从而提升代码的灵活性和可维护性。策略模式广泛应用于需要动态切换算法的场景,如游戏中的攻击方式、士兵列队等。其结构包括策略接口、具体策略类和上下文类,客户端通过上下文类调用具体策略,实现算法的动态切换。策略模式符合开闭原则,新增算法时只需添加新的策略类,无需修改现有代码,降低了代码的耦合度。

2025-05-11 08:30:00 900

原创 Java设计模式-观察者模式(行为型)

观察者模式(Observer Pattern)是一种行为设计模式目的是定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都能得到通知并自动更新。其核心思想是将被观察的对象(主题,Subject)和观察它的对象(观察者,Observer)分离,使得它们可以独立地改变和复用。主题维护一个观察者列表,当主题状态改变时,通过调用观察者的更新方法来通知它们,实现了低耦合的事件通知机制。通过一个简单的问题来描述观察者模式中所涉及的各个角色。

2025-05-10 08:15:00 640

原创 GO语言入门基础:网络编程1

运行服务器程序时,通过命令行参数传递服务器侦听的本地地址,启动后会循环接收客户端的连接,然后从客户端接收文件,并保存到本地目录中。运行客户端时,通过命令行参数指定连接的服务器地址以及要发送文件的路径,启动之后以TCP连接服务器,建立连接后将向服务器发送文件。:运行客户端程序,服务器地址为“192.168.1.103:7779”,要发送的文件路径为“D:\pics\001.jpg”。列出的命令行参数中,第一个元素总是指向当前运行程序的名称(或路径),因此,读取命令行参数应从第二个元素开始(索引为1)。

2025-05-05 08:30:00 729 1

原创 Go语言入门基础:协程

协程类似于线程,但它并非与线程一一对应,而是由Go运行时内部进行调度,有可能一个线程会运行多个协程,也有可能一个协程在不同线程间切换,这一切都是Go运行时自动分配和控制的。所以,当新的协程代码向通道发送了一次数据后,数据会缓存在通道中,不要求立即被取出,代码就不会被阻塞——哪怕。四个协程一起运行,这种情况会不断地发生,最终导致状态不统一,引发逻辑错误,就会出现剩余的小球总数为负数的结果。是双向通道类型,它既可以赋值给只接收数据的单向通道类型的变量,也可以赋值给只发送数据的单向通道类型的变量。

2025-05-03 08:30:00 654 1

原创 Go语言入门基础:数据压缩

Go标准库支持许多常见的压缩(含解压缩)算法,这些API分布在以下几个包中:1. compress/bzip2:支持解压软件压缩的数据。2. compress/flate: 使用算法,支持数据的压缩与解压缩。3. compress/gzip: 使用算法,即格式,支持压缩与解压缩。4. compress/lzw: 使用算法,即,支持压缩与解压缩。5. compress/zlib: 使用标准,支持压缩与解压缩操作。6. archive/zip: 提供了访问文档的。7. archive/tar: 提

2025-05-02 08:30:00 764

原创 Go语言入门基础:命令行参数

因此,Go标准库中提供了flag包,它不仅能免去手动分析命令行参数的麻烦,还起到了规范参数的作用。其中,参数列表的第一个元素总是当前程序的名称(可执行文件路径,可以是绝对路径,也可以是相对路径),从第二个元素起才是命令行参数。flag包的工作方式是将代码中定义的变量与对应的命令行参数进行绑定,程序代码中只需要访问特定的变量就能得到命令行参数的值。命令行参数一般以空格分隔,所以,如果参数内容包含空格符,可以把参数内容放在一对双引号中。下面的代码将获取传递给当前程序的命令行参数,然后将其输出到屏幕上。

2025-05-01 08:15:00 523 1

原创 Go语言入门基础:加密与解密算法2

如果Equal函数返回false,表明mac1和mac2不一致,即表明消息不完整,有可能是在网络传输过程中发生了“掉包”现象,也有可能被恶意篡改过。OAEP是一种优化方案,它增加了两个参数:hash参数指定要使用的哈希算法,label参数可以指定任意内容,它不会被加密,仅作为密文的附加内容被传递,如果不需要,可以为空。Decode函数返回了两个值,一般只使用第一个值——Block指针类型,从中可以读出原来的消息正文,第二个返回值([]byte类型)存放的是除了PEM数据以外的内容(保留数据)。

2025-04-30 08:00:00 923

原创 Go语言入门:加密与解密1

调用函数可通过参数来传递字符映射表,base64包内部定义了两个标准的字符映射表。开发者也可以向函数传递自定义的字符映射表。字符串的总大小必须是64字节。字符串中不能出现换行符——“\n”“\r”。请看下面的示例。// 自定义字符映射表// 创建encoding// 待编码的数据testData := "一二三四五六七"// 编码fmt.Printf("原数据: %s\n", testData)fmt.Printf("编码后: %s\n", ecStr)// 解码。

2025-04-29 08:15:00 894

原创 Go语言入门:目录与链接

不管是临时文件还是临时目录,其用途都是临时的数据读写,因此,开发人员在编写程序代码时应当注意,当不再需要临时文件(或临时目录)时要将其删除——这项工作不应该留给用户去完成。应用程序在使用相对路径读写文件时,默认会以工作目录为基准,即文件或子目录会存放到工作目录下。由于F1、F2、F3指向同一个文件,所以通过F2修改文件后,从F1中也能读取到文件的最新内容,毕竟读写的都是同一个文件,只是文件名不同而已。函数在调用时,如果被删除的目标是目录,会连同其包含的文件、子目录,以及子目录中的内容一起被删除。

2025-04-27 11:15:42 709

原创 Go语言入门:文件操作

参数用于授予新文件权限(flag参数包含O_CREATE模式),虽然该参数类型声明为FileMode,而实际上在传递参数值时可以使用32位的整数值,因为FileMode是基于uint32定义的新类型。权限值为0244,即文件所有者具有写入权限,而用户组和其他用户仅有读取文件内容的权限。不过,有时候可能需要一些较为灵活的操作方式,例如以特定的权限创建文件或者以可读可写/只读方式打开文件等。每次写入的内容都会追加到原有内容的后面,原有内容不会被删除。打开文件后,会从文件的末尾写入内容,原有的内容不会被清除。

2025-04-25 08:15:00 896

原创 Go语言入门:输入输出

内存缓冲区可以将数据临时存放在内存中,以供程序读写。当应用程序退出后,数据就会丢失。相较于磁盘文件,直接在内存中读写数据具有更高的效率,适合在程序需要时存放少量数据,不宜使用过于庞大的数据,毕竟内存空间是有限的。最简单的内存缓冲区就是使用byte类型的数组/切片。调用make函数创建[]byte实例时设置其长度为0,这是为了防止出现空字节。因为长度不为0的[]byte实例会使用数值0来初始化元素列表,当调用append函数后会把新的数据追加到原数据的末尾,这会导致最终的缓冲区出现一段空白内容。

2025-04-24 08:00:00 1840 1

原创 GO语言入门:排序

Less方法与15.2节和15.3节中Slice函数中的less参数相似,用于确定索引为i的元素是否比索引为j的元素小,如果是,就返回true;此排序方案具有一定的灵活性——不仅可以实现默认的递增排序,也可以实现递减排序。:对字符串类型的切片对象进行排序。类型的输人参数,它们代表将要进行比较的两个元素的索引,如果索引为i的元素比索引为j的元素小,就返回。以下示例实现了按字符串的长度进行递增排序,其核心也是Slice函数的应用。先分别求得位于索引i、j处的元素与8整除后的余数,再比较两个余数的大小。

2025-04-23 08:15:00 862 1

原创 GO语言入门:常用数学函数3

实际上,计算机通过特定算法产生的并非真正意义上的随机数,只是一种模拟,因此也称为“伪随机数”。相对地,真随机数则是指客观世界中自然产生的随机行为,如掷硬币、随机抽查产品等。math/rand包实现了生成伪随机数的 API,可以产生区间在[0,1]的浮点数,或者特定范围内的整数。rand包也支持随机生成整数序列和“洗牌”程序。

2025-04-21 08:00:00 607 1

原创 GO语言入门:常用数学函数2

math/big包中公开了一些实用 API,用于表示大型整数值和浮点数值。当基础类型无法容纳要使用的数值时,应改用 big 包中提供的新类型。例如Int、Float等。

2025-04-20 15:44:02 379

原创 Go语言入门:常用数学函数1

Abs 函数接收一个float64类型的参数,然后返回它的绝对值。

2025-04-17 12:22:32 511 1

原创 Go语言入门:字符串处理4(字符转换)

Repeat 函数的功能是将输入字符串重复指定的次数,组成新的字符串实例并返回。例如,下面的代码会将字符串 “ABC” 变成 “ABCABCABC”。要注意的是,Repeat 函数并非可以无限制地重复的,如果重复的次数过大,超出了可分配内存的有效空间,就会引发运行时错误。

2025-04-16 08:00:00 624 1

原创 GO语言入门:字符串处理3(查找修剪字符串)

下面的示例代码将字符串“一天又一天”中的“天”替换为“年”。Replace函数的功能是将字符串中部分内容替换为新的字符串。参数s是原字符串对象(待替换的字符串);参数old指定要被替换的内容;参数new指定新的内容;参数n表示在原字符串中进行替换操作的次数。例如上述示例中,原字符串中有两处“天”,将参数n设置为2,表明将两个“天”都替换为“年”。如果参数n设置为1,那么只替换第一个“天”,变成“一年又一天”。参数n也可以设置为0,表示替换次数不受限制。

2025-04-15 08:15:00 473 1

原创 Go语言入门-字符处理2(输入文本)

fmt包提供多组Scan函数用于读取输入信息,按应用目标可分为从标准输入流读取、从字符串实例提取、从文件或io.Reader接口流读取三类。示例展示Scanln函数实现键盘输入整数和运算法则进行计算。Fscanln函数可从文件逐行读取文本,通过for循环配合EOF错误判断读取完整文件。Scanf等函数可用格式化方式读入文本,但格式化功能有限,使用%s控制符易引发问题,用%d可解决部分问题。

2025-04-14 08:30:00 906

原创 GO语言入门:字符串处理1(打印与格式化输出)

fmt包中的PrintPrint(默认格式输出)、Println(末尾加换行)、Printf(格式控制输出)。输出到文件或io.WriterFprintFprintlnFprintf。

2025-04-13 08:30:00 1679 1

原创 GO语言入门-反射5(结构体的Tag)

在定义结构体类型时,可以在字段后面加上一个字符串,称为 Struct Tag。Tag 主要用来补充附加信息。Tag 由多个 key - value 构成,并以空格来分隔,key 和 value 之间用英文的冒号分隔。value 必须放在一对双引号中。在 reflect 包中定义了 StructTag 类型,表示 Tag 实例。从定义上可以看出,StructTag 是以字符串为基础的新类型。下面的示例演示了如何通过字段的 Tag 来为用户名和密码设置限制条件。

2025-04-11 11:07:55 840

原创 Go语言入门-反射4(动态构建类型)

1. `New` 函数:用于创建指定类型的新实例,返回 `*T` 类型。2. `ArrayOf` 函数:在运行阶段动态创建数组类型。3. `StructOf` 函数:动态创建新的结构体类型,但目前只能添加字段,不支持生成方法列表。4. `FuncOf` 函数:动态创建新的函数类型,`MakeFunc` 函数用于构建函数体逻辑。5. 生成通用函数体:通过 `MakeFunc` 函数生成函数实例,并赋值给符合类型的函数变量。

2025-04-10 12:22:54 944

原创 GO语言入门经典-反射3(Value 与对象的值)

使用 `Value` 类型公开的 `Set` 方法,能在运行时修改某个对象的值。其实现的功能与赋值运算符相同,但通过反射技术进行赋值,在一些需要动态处理的代码逻辑中会比较灵活(例如动态生成函数体逻辑)。

2025-04-08 09:25:36 645

原创 Go语言入门-反射2(获取类型信息)

调用 TypeOf 函数,会返回一个 Type 对象,其中包含了对象所属类型相关的信息。例如,假设定变量 a,类型为 uint16,赋值为 2800。调用 TypeOf 函数来获取与 uint16 类型关联的 Type 实例。然后尝试向屏幕输出类型信息。12.2.1 类型分辨Type.Kind 方法返回 reflect.Kind 类型的值,它是以 uint 为基础定义的,通过一系列常量值来为各种数据类型定义标识。分辨对象的数据类型是运用反射技术的基础。

2025-04-05 08:00:00 693

原创 Go语言入门-反射1(关键API)

Type 中比较常用的方法如下。(8)SetUint:设置无符号整数值,对象类型为 uint、uint8、uint16、uint32、uint64 的均可使用。(2)Uint:如果对象的值为 uint、uint8、uint16、uint32、uint64 类型,那么该方法就返回该值。(1)Int:如果此对象的值为 int、int8、int16、int32、int64 类型,那么该方法将返回该值。(5)Index:如果对象的值是数组、切片或字符串类型,则该方法返回指定索引处的值,类似于 a[0]、a[1]。

2025-04-04 08:00:00 753

原创 Go语言基础-环形链表

环形链表没有起点与终点,所有元素组成一个封闭的圆环结构。元素指针在环形链表中可以无限循环移动。如图 11-5 所示,A、B、C、D、E 组成环形链表。假设当前指针位于元素 A 处,指针向前移动,可以访问元素 A、B、C、D、E、A、B、C……由于环形链表没有首尾之分,所以如果指针一直向前移动,它就会循环访问元素,如图 11-6 所示。假设指针位于元素 D 处,并且向后移动,那么访问元素的顺序为 D、C、B、A、E、D、C、B……如图 11-7 所示。

2025-04-02 08:30:00 722

原创 Go语言映射与链表

映射(map)是一种集合,它的每个元素都带有 key。这个 key 用于标识元素,在同一个 map 对象中,元素的值可以重复出现,但 key 必须是唯一的。数组、切片类型的对象是通过 int 类型的索引来访问元素的,而映射类型的对象是通过 key 来访问元素的,key 可以是任意类型。

2025-03-31 08:30:00 764 1

原创 Go语言入门经典:数组与切片详解

数组和切片是Go语言中两种重要的数据结构。数组是一种固定长度的集合,而切片则是一种灵活的动态集合。本章将详细讲解数组和切片的定义、初始化、访问元素、动态操作等内容,帮助读者全面掌握这两种数据结构。

2025-03-30 08:30:00 919

原创 Go语言接口详解(5000字)

接口定义时,只需要提供方法的名称、参数和返回值,不需要实现代码。start() // 无参数,无返回值stop() uint16 // 无参数,有返回值timeout(long int64) bool // 有参数,有返回值在接口中,方法的命名必须是有效的,且同一个接口中不能出现重复的方法名。getContext(key int) (uint8, bool) // 方法名重复,编译错误接口是Go语言中实现多态的重要机制,通过接口可以将不同的类型统一起来,实现代码的解耦和复用。

2025-03-29 08:00:00 924 1

原创 Go语言结构体详解(5000字)

在Go语言中,当标准库提供的数据类型无法满足开发需求时,开发人员可以通过type关键字自定义新类型。自定义类型可以基于现有类型,也可以是结构体、接口、函数等复杂类型。上述代码基于string类型定义了新的类型name。尽管name类型与string类型的用法相似,但它们是两种独立的类型,不能直接进行比较运算。fmt.Printf("变量a的类型:%T\n", a)fmt.Printf("变量b的类型:%T\n", b)变量a的类型:string变量b的类型:main.name如果尝试直接比较a和b。

2025-03-28 08:00:00 685 1

原创 GO语言控制流程示例

1.1 基础结构与短声明Go的if语句允许在条件中直接声明变量,这是其他语言不具备的特性。示例:文件读取时的安全判断if1.2 嵌套条件与逻辑运算符Go支持&&(与)、||(或)、!(非)三种逻辑运算符实战案例:用户权限验证系统。

2025-03-26 08:30:00 281 1

原创 Go语言控制流程(2)

在Go语言的语句中,是一个特殊的关键字。在其他语言(如C、Java)的语句中,每个分支默认会贯穿执行,即执行完一个后会继续执行下一个,除非使用语句来终止。而在Go语言中,语句的分支默认是不会贯穿执行的,每个执行完后就会自动跳出语句。关键字的作用就是打破这种默认行为,让程序继续执行下一个分支。下面是一个简单的示例代码,展示了语句的使用:1.3 代码解释在上述代码中,我们定义了一个变量并赋值为2。进入语句,由于的值为2,所以执行分支,打印出“数字是2”。由于分支中使用了语句,程序会继续执行下一个分支,

2025-03-25 08:30:00 1013 1

原创 Go语言流程控制深度解析(1)

顺序执行:最基础的代码执行逻辑,简单直接。if语句:实现条件判断,支持复杂嵌套和初始化,是逻辑分支的基础。switch语句:清晰处理多分支,支持表达式匹配和类型判断,代码更简洁。for循环:Go语言唯一的循环结构,形式多样,能满足各种循环需求。跳转语句breakcontinuegoto辅助控制流程,灵活改变执行路径。通过大量带详细解释的代码示例,希望读者能深入理解Go语言流程控制的核心要点。在实际开发中,多练习、多应用这些知识,才能编写出逻辑清晰、高效可靠的程序。

2025-03-24 08:30:00 803 1

原创 Go语言函数详解

本文是Go语言函数的全面指南,涵盖从基础到高级应用的内容。首先介绍函数基础定义,包括语法结构,以`func`开头,需明确函数名、参数列表和返回值列表,并给出无参数无返回值、有参数有返回值、多返回值函数的示例。接着阐述函数调用机制,强调参数传递和返回值处理规则,还给出常规调用和多次调用同一函数的示例。然后深入探讨`return`语句,说明其结束函数执行和传递返回值的功能,以及在有无返回值函数中的使用场景。此外,介绍多返回值函数的优势,如可同时返回操作结果和错误信息,并给出常规多返回值和命名返回值函数的示例。

2025-03-23 10:45:49 705

原创 Go语言指针学习

指针是Go语言中的一种特殊类型,它的实例保存的是被引用对象的内存地址,而非对象自身的值。当指针变量声明后若未获取到有效的内存地址,其默认值为nil(空引用)。

2025-03-22 21:01:25 639

原创 go语言时间与指针

Month。

2025-03-21 08:30:00 420

原创 Go语言中的基础类型

通过本文的介绍,我们了解了Go语言中的字符与字符串类型,以及数值类型的多种表示方法。掌握这些基础知识对于编写高效的Go程序至关重要。希望通过这些示例代码和解释,读者能够更好地理解和应用Go语言中的变量与常量。在实际应用中,选择合适的数据类型可以显著提高程序的性能和可维护性。理解不同数据类型的特性和使用场景是成为一名优秀Go程序员的关键。

2025-03-20 08:30:00 668

原创 go变量与常量详解(5000字)2

变量声明方式常量特点使用const关键字声明定义后不能修改支持批量声明可以使用iota生成器作用域规则全局变量在整个包中可见局部变量只在声明它的代码块中可见支持变量遮蔽变量默认值数值类型:0布尔类型:false字符串:“”指针:nil最佳实践变量名要有意义,使用驼峰命名尽量使用短变量声明(:=)使代码更简洁及时释放不需要的变量合理使用批量声明注意变量的作用域注意事项变量必须先声明后使用变量声明后必须使用常量一旦定义不能修改。

2025-03-19 15:46:34 504

原创 Go运算符深度解析(超详细19000字)

Go语言提供了丰富的运算符系统,使程序员能够编写简洁高效的代码。本文全面介绍了Go语言中的各类运算符,包括算术运算符、比较运算符、逻辑运算符、位运算符、成员运算符、取地址运算符和复合赋值运算符等。算术运算符在数值计算中扮演核心角色,包括基本的四则运算、取余、自增自减等。Go语言没有内置的指数运算符,但可以使用math.Pow函数实现。比较运算符用于比较两个值,返回布尔结果。比较浮点数时需要注意精度问题,应使用阈值比较。不同类型的比较有不同的规则,某些复合类型(如切片、映射)不可直接比较。逻辑运算符。

2025-03-18 23:26:46 1042

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除