自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(55)
  • 资源 (2)
  • 收藏
  • 关注

原创 Go 中 Actor 模型与 GMP 模型的区别

在 Go 语言中,Actor 模型和GMP 模型(Goroutine、M 线程、P 调度器)是两种不同的并发编程模型。GMP 模型是 Go 语言运行时的核心调度机制,而 Actor 模型是一种并发编程的设计范式,通常可以在 Go 中使用 goroutine 和 channel 进行实现。每个 Actor 维护自己的状态。Actor 通过消息传递进行通信,避免了传统锁竞争问题。Actor 处理消息时是原子的,不会并发执行。:Go 语言的协程,每个 Goroutine 代表一个独立的任务。

2025-02-13 18:02:11 694

原创 Go中的Actor模型应用场景

Actor模型是一种并发计算模型,每个Actor都是一个独立的计算实体,它能够接收消息、处理消息并发送消息。Actor模型简化了并发编程的复杂性,通过消息传递来避免共享状态,从而使得并发的执行变得更为直观。

2025-02-13 16:43:17 450

原创 Go 中 map 的底层结构和扩容机制

Go 采用渐进式扩容策略,即每次插入或删除操作时,会迁移部分桶中的数据。:是存储键值对的桶结构,每个桶最多存储 8 个键值对。如果某个键值对被删除,其对应的桶不会立即清理,而是标记为。扩容时,旧桶中的键值对会根据新的哈希值重新分配到新桶中。:将旧桶中的键值对重新计算哈希值,并迁移到新桶中。可能会扩容,其键值对的内存地址可能会发生变化。中的元素数量增加时,为了维持高效的存取性能,:当某个桶的溢出链表过长时,也会触发扩容。:新桶数组的大小通常是旧桶数组的两倍。:扩容时,指向旧桶数组的指针。

2025-02-06 09:40:32 335

原创 Go之map的比较

在 Go 中,比较两个map是否相等需要手动实现逻辑或使用手动实现:通过检查长度、键和值是否相等,适用于简单的map,性能更高。:适用于复杂类型的比较,代码更简洁,但可能有性能开销。

2025-02-06 09:39:59 373

原创 提示词写作指南:如何更快让 AI 理解需求

清晰的任务描述:直接表达你希望执行的操作。提供范例:通过示例或模板帮助 AI 理解输出要求。设定风格或语气:影响内容的情感表达和语气。分步提示:将复杂任务拆分为多个步骤,逐步执行。设定输出格式:明确输出的结构,确保条理清晰。字数或时间限制:控制输出内容的长度和深度。关键词或要素列表:确保 AI 不遗漏任何重要内容。任务优先级:强调最重要的部分,确保任务重点突出。

2025-02-05 14:03:27 895

原创 AI 提示词(Prompt)写作学习文档

写好 AI 提示词的关键在于明确性上下文的提供以及任务的精细描述。通过学习并掌握不同类型提示词的写作技巧,你将能够更高效地与 AI 互动,获得更符合需求的输出。

2025-02-05 13:53:32 717

原创 Go之map的比较

在 Go 中,比较两个map是否相等需要手动实现逻辑或使用手动实现:通过检查长度、键和值是否相等,适用于简单的map,性能更高。:适用于复杂类型的比较,代码更简洁,但可能有性能开销。根据具体需求选择合适的方法,可以更好地平衡代码的可读性和性能。

2025-01-23 00:15:00 271

原创 Go之interface的比较

在 Go 中,两个interface底层类型是否相同:如果底层类型不同,则不能比较。值是否相等:如果底层类型相同且值相等,则比较结果为true。nil的处理:如果其中一个interface值为nil,则需要特别处理。可比较的类型:如果底层值是不可比较的类型(如切片、映射、通道),则不能直接比较。为了安全地比较interface值,建议使用类型断言或类型切换来处理具体的底层类型。

2025-01-23 00:00:00 390

原创 Go之高效拼接字符串

拼接大量字符串:推荐使用或。拼接少量字符串:可以使用操作符或。需要格式化字符串:使用。

2025-01-22 00:15:00 858

原创 Go 中 defer 的底层数据结构和特性

defer的底层实现依赖于_defer结构体和 Goroutine 的链表。defer的执行遵循 LIFO 原则,最近声明的defer会最先执行。defer的参数在声明时计算,而具名返回值可以在defer中被修改。defer与panic和recover结合,可用于异常处理。理解defer的底层实现和特性,可以帮助你更好地使用它来管理资源、处理异常和简化代码逻辑。希望以上内容能帮助你深入理解 Go 中defer的底层实现和特性。

2025-01-22 00:00:00 235

原创 Go 中单引号、双引号和反引号的区别

标记类型特点单引号rune表示单个 Unicode 字符,类型为runeint32的别名)。双引号string表示字符串,支持转义字符,不可变,默认 UTF-8 编码。反引号string表示原始字符串,内容不会转义,支持多行文本,不可变。希望以上内容能帮助你更好地理解 Go 中单引号、双引号和反引号的区别和使用场景。

2025-01-21 13:48:06 477

原创 Go 中的 defer:执行顺序、修改返回值的时机及注意事项

defer的执行顺序为后进先出(LIFO)。defer在return之后执行,但在返回值被传递给调用方之前。defer可以修改命名返回值,但无法修改无命名返回值。在defer中可以捕获panic并使用recover恢复程序。defer的参数在声明时求值,而不是在执行时。理解defer的这些特性,可以帮助你更好地利用它进行资源管理和错误处理。

2025-01-21 13:43:02 556

原创 Go 语言中 for range 与闭包的陷阱及详细解释

闭包是一个函数和其周围的状态(词法环境)的组合。在 Go 中,闭包通常是指一个匿名函数,它可以捕获外部变量的值。例如:go复制在上述代码中,makeAdder返回了一个闭包,该闭包捕获了变量base,并可以在后续调用中使用它。在for range循环变量的作用域:循环变量的作用域是整个循环体,闭包捕获的是变量的引用,而不是值。陷阱表现:所有闭包可能捕获的是同一个变量的最终状态,而不是每次迭代时的值。解决方法在循环中创建局部变量副本。使用索引访问原始集合的元素。使用立即执行的闭包捕获当前值。

2025-01-21 11:56:42 666

原创 Go 语言中 for range 的地址变化分析

在for range中,循环变量是原始元素的副本,其地址可能在每次迭代时相同(Go 1.22 之前)或不同(Go 1.22 之后)。循环变量的地址与原始集合中元素的地址始终不同。在涉及取地址或闭包时,需特别注意循环变量的地址特性,以避免潜在的陷阱。

2025-01-21 11:47:16 380

原创 Go 语言中 Slice 和 Array 的区别

定义array是一个固定长度的序列,长度在声明时确定,且不可改变。声明方式go复制var arr [5]int // 定义一个长度为5的整型数组特点长度固定,一旦声明,长度不可更改。在内存中连续存储,可以使用索引快速访问元素。如果需要固定长度的序列且对性能要求极高,推荐使用array。如果需要动态调整长度的序列,推荐使用slice,其灵活性和强大的功能更适合大多数场景。

2025-01-21 11:35:45 632

原创 编程语言“鄙视链”背后的真相

编程语言的“鄙视链”现象,虽然源于语言特性和历史背景,但其背后反映的更多是程序员们对技术的偏见与认同。在团队协作中,如何化解语言间的误解与矛盾,是每个开发者需要面对的挑战。而从行业发展的角度看,“鄙视链”既促进了技术的多元化发展,也可能在某种程度上限制了创新。只有打破这种偏见,才能真正推动编程技术的进步。无论你偏爱哪种编程语言,最终的目标都是让技术为人类带来更多的便利与可能。

2025-01-20 17:57:52 405

原创 技术领导力:从代码执行者到团队掌舵人

技术领导力是指在技术领域中,通过自身的专业知识、技术能力和管理技巧,带领团队实现目标的能力。它不仅包括对前沿技术的掌握和应用,还涵盖了团队管理、沟通协作、战略规划等多方面的能力。具有技术领导力的程序员,不仅能够解决复杂的技术问题,还能通过有效的方式激励团队成员,推动项目的顺利进行。技术领导力是程序员职业发展的重要方向,它不仅能够提升个人的职业竞争力,还能为团队和公司带来更大的价值。

2025-01-20 17:47:07 582

原创 MySQL性能简介及优化方法

MySQL 是一种免费开源的兼席 SQL 数据库管理系统。它以快速的架构和高效的数据操作而水平应用场景。

2025-01-09 18:49:46 354

原创 Mysql-CHAR和VARCHAR详解

是两种用于存储字符串的字段类型,它们的主要区别在于存储方式、长度限制、性能和用途。如果字符串长度小于定义的长度,系统会在右侧用空格填充(用于存储),但检索时会去掉填充的空格。存储空间利用率更高,只占用实际字符所需的字节数,加上 1 或 2 个字节的长度信息。在存储和检索时自动去除尾部的填充空格,可能会导致某些情况下的数据不一致问题。会固定分配指定长度的存储空间,无论实际存储的字符串长度是多少。:适用于长度不固定的字符串,比如文章内容、用户输入的备注等。如果定义的长度小于实际存储数据长度,数据会被截断。

2025-01-09 16:46:21 733

原创 GoLand 中 Tabnine 插件的使用教程

Tabnine 是一款基于人工智能的代码补全工具,支持多种语言和集成开发环境(IDE)。在 GoLand 中安装并使用 Tabnine,可以显著提升代码编写效率,提供智能代码补全建议。

2025-01-09 00:15:00 2031

原创 Golang基础-原子操作和锁区别

是无锁的,适用于简单的数据操作,能够提供较高的性能。它适合于一些简单的计数、标志位的修改,适用于高并发且对性能要求较高的场景。

2025-01-08 00:30:00 528

原创 Golang基础-GC

Go 语言的 垃圾回收(GC) 是自动管理内存的重要机制,负责清理不再使用的内存,以避免内存泄漏。Go 的垃圾回收器采用的是 标记-清除(Mark-Sweep) 算法,配合 分代回收(Generational GC) 和 并发回收 等优化措施,旨在保证高效且最小化暂停时间。以下是对 Go 垃圾回收的详细介绍,包括工作原理、算法细节、性能优化等方面。Go 语言的垃圾回收设计目标是:低暂停时间:尽量避免长时间的暂停,以提高应用程序的响应性和实时性。并发执行:GC 不应该阻塞应用程序的执行,尽可能与程序并发运行。

2025-01-08 00:15:00 775

原创 Golang基础-GC性能优化

Go 语言的垃圾回收机制通过标记-清除算法、并发回收和增量回收等手段,尽量减少了 GC 对程序性能的影响,并通过。

2025-01-08 00:15:00 547

原创 Golang基础-浅聊内存泄漏

尽管 Go 的垃圾回收机制可以有效地管理内存,但开发者仍然需要注意避免内存泄漏,特别是在涉及指针引用、缓存、长时间运行的 goroutine 和系统资源时。通过合理的内存管理、定期清理和监控内存使用情况,能够有效地避免内存泄漏问题。如果你在使用 Go 时遇到了内存泄漏问题,建议使用 Go 提供的性能分析工具(如。

2025-01-08 00:15:00 990

原创 Golang基础-GC三色标记法

三色标记法是垃圾回收算法中的一种高效的标记方式,它通过将对象分为白色、灰色、黑色来区分对象的状态,从而确保并发环境下的内存管理。Go 从1.5 版本开始采用三色标记法,并结合并发标记和清理,避免了传统 GC 的停止世界问题,使得 GC 停顿时间大大减少,应用程序性能得到了提升。不同的 Go 版本不断优化 GC 的并发性和效率,尤其是在Go 1.11和之后的版本,GC 变得更加高效和精细。

2025-01-08 00:15:00 1128

原创 Golang之Kafka的应用

在 Golang 中,Kafka 是一个常用的分布式消息队列,可以通过社区支持的库(如sarama和)进行操作。以下是 Kafka 在 Golang 中的使用详细介绍,包括生产者、消费者、和高级功能。librdkafka以下内容以为例。

2025-01-08 00:15:00 591

原创 Golang基础-sync.Pool介绍和用法

sync.Pool是 Go 标准库中提供的一种对象池(Object Pool)机制,主要用于。它通过维护一个对象池,允许多个 goroutine 重用这些对象,而不是每次都进行内存分配。这有助于减少内存分配和垃圾回收的开销,提高程序的性能,尤其是在频繁创建和销毁对象的场景中。sync.Poolsync.PoolGet():从池中获取一个对象。如果池中没有对象,则会调用New函数(如果提供了)来生成一个新对象。Put():将对象放回池中,以便后续复用。sync.Pool​。

2025-01-08 00:00:00 1050

原创 Golang基础-mutex的正常模式和饥饿模式1

为了解决了等待goroutine队列的长尾问题饥饿模式下,直接由unlock把锁交给等待队列中排在第一位的goroutine (队头),同时,饥饿模式下,新进来的goroutine不会参与抢锁也不会进入自旋状态,会直接进入等待队列的尾部。对于两种模式,正常模式下的性能是最好的,goroutine可以连续多次获取锁,饥饿模式解决了取锁公平的问题,但是性能会下降,这其实是性能和公平的一个平衡模式。的实现中,当一个 goroutine 获取了锁时,其他请求锁的 goroutine 会被阻塞,直到锁被释放为止。

2025-01-07 01:00:00 996

原创 Golang基础-mutex的正常模式和饥饿模式2

在正常的锁定模式下,

2025-01-07 01:00:00 1266

原创 Golang基础-Mutex自旋态出现条件

是一种轻量级的锁机制,适用于锁竞争不激烈、锁持有时间短的场景。

2025-01-07 01:00:00 466

原创 Golang基础-读写锁及应用场景

Go 提供的读写锁(

2025-01-07 01:00:00 2310

原创 Golang基础-值传递、引用传递介绍

引用传递是指将实参的地址(指针)传递给函数,函数内部的参数是实参的引用(指向相同的内存地址)。(Pass by Reference)描述了函数调用时参数传递的方式,它们决定了函数内部对参数的修改是否会影响函数外部的变量。在引用传递中,函数接收到的是实参的内存地址(即指向数据的指针)。函数内部的参数是实参的副本,对参数的任何修改都不会影响到原始实参。在值传递中,函数接收到的是实参的副本。对于值类型,如果希望传递引用(即原始数据的地址),可以将值类型的变量包装成指针类型并传递。

2025-01-07 00:45:00 556

原创 Golang基础-Slice基本介绍

当切片的长度超过容量时,Go 会分配一个更大的底层数组(容量大约是原来的两倍),然后将原切片的元素复制到新的数组中。切片的底层是基于数组实现的,切片并不存储数据,而是描述了对底层数组的一部分的引用。切片的扩容机制是非常高效的,但切片的容量和长度增加时可能会导致内存的重新分配。切片支持灵活的切片操作,并允许多个切片共享同一底层数组,因此修改一个切片的内容会影响所有共享同一底层数组的切片。切片是动态的,它的大小是可以变化的。:切片的总容量,表示从切片的开始位置到底层数组的末尾位置能够存储的元素数量。

2025-01-07 00:45:00 1388

原创 Golang基础-sync.Mutex

这是。

2025-01-07 00:45:00 751

原创 Golang基础-值类型、引用类型区别

引用类型是指变量保存的是数据的地址(引用),即内存中的指针。当你将引用类型变量赋值给另一个变量时,实际上传递的是对同一块内存区域的引用,两个变量指向相同的内存地址。当你将一个值类型的变量赋值给另一个变量时,实际上是复制了值类型变量的内容,两个变量是相互独立的。:当你将引用类型变量传递给函数时,传递的是对原数据的引用,即传递内存地址,而不是数据的副本。:修改一个引用类型变量会影响其他引用了相同数据的变量,因为它们指向的是同一块内存区域。:值类型的变量默认是不可变的,不会受到其他变量改变的影响。

2025-01-07 00:30:00 906

原创 Golang基础-Channel

例如,当某个 goroutine 尝试发送数据到一个满的缓冲区时,它会被阻塞;类似地,当某个 goroutine 尝试从一个空的缓冲区接收数据时,它也会被阻塞。创建时,可以指定一个缓冲区大小,这决定了可以存储的元素数量。会分配一个缓冲区来存储数据,直到缓冲区满时,发送操作会阻塞。接收操作也是类似,当缓冲区为空时,接收操作会阻塞。可以避免频繁的阻塞,适合用在生产者和消费者模式中,特别是当数据传输速度不平衡时,可以提高并发程序的性能。不过,要小心缓冲区溢出,确保合理的缓冲区大小,以免发生不必要的阻塞。

2025-01-07 00:30:00 917

原创 Golang基础-new、make区别

s := make([]int, 5, 10) // 创建一个长度为 5,容量为 10 的 slice。p := new(int) // 分配一个 int 类型的内存,值为 0,返回指针。(*m)["key"] = 42 // 运行时错误:分配的 map 没有初始化。m := new(map[string]int) // m 是 *map 类型,未初始化。m := make(map[string]int) // 初始化。p := new(int) // 分配 int 的内存。

2025-01-07 00:15:00 982

原创 Golang基础-Slice扩容机制详解

切片容量每次扩容为原容量的 2 倍。

2025-01-07 00:15:00 302

原创 Golang基础-Map

的扩容是一个相对昂贵的操作,因为它需要重新计算每个元素的哈希值,并将它们分配到新的桶中。:插入操作的平均时间复杂度也是 O(1),但是当哈希冲突较多或发生扩容时,可能会退化为 O(n) 的时间复杂度。是基于哈希表实现的,支持高效的查找、插入和删除操作,具有平均 O(1) 的时间复杂度。:删除操作的时间复杂度同样是 O(1),但在删除过程中需要重新调整哈希表中的元素位置。中的元素数量超过一定阈值时,Go 会扩容哈希表,增加桶的数量,以保持操作的效率。的空间开销较大,主要是由于哈希表和桶的存储机制。

2025-01-07 00:15:00 755

原创 Golang基础-基础类型哪些是线程安全?

和其他 I/O 操作对象(如数据库连接、网络连接等)通常都不是线程安全的,需要确保对这些资源的访问是同步的,避免并发访问时产生问题。了解这些可以帮助你更好地在 Go 中处理并发和同步,避免因并发访问导致的数据竞争和程序错误。这些是用于显式同步的原语,能够保护其他类型在多 goroutine 环境中的并发访问。但如果并发修改,可能会导致数据竞争。:如果你希望确保对某个共享资源的访问是串行化的,可以使用这些锁来同步对资源的访问。是 Go 1.9 引入的一个并发安全的 map 实现,它提供了并发读写的支持。

2025-01-07 00:15:00 580

Golang之敏感词过滤器的设计与实现

通过资源中的示例,开发者可以快速理解并应用敏感词过滤器,同时结合实际需求灵活调整和优化功能。

2025-01-03

Golang之相似图片检测-感知哈希算法

源码示例

2025-01-02

基于MFC的计算器程序

这个是在实验中写的应用,在界面点击数字可以进行加减乘除等运算

2018-11-30

VS2010聊天室的开发

学习过程当中的小实验~使用时,任选一个运行的终端作为服务器,其余的用户终端都在这个服务器的协调下交换信息

2017-12-19

空空如也

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

TA关注的人

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