程序设计
文章平均质量分 68
专注于探索、解析和分享各种程序设计语言知识的宝库。无论你是编程新手,还是资深开发者,这个专栏都将为你提供深入、细致、全面的程序设计语言学习体验。你会了解到每种语言的起源、发展以及它们在各类项目中的应用场景。我们会通过丰富的实例,展示如何使用这些语言解决实际问题,从而帮助你更好地理解和掌握它。
许野平
非常喜欢软件设计这份工作,有不错的数学基础,喜欢读书、摄影与音乐。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Rust:实现仅通过索引(序数)导出 DLL 函数的功能
本文介绍了在Rust中隐藏DLL函数名、仅通过序数导出的方法。通过创建.def模块定义文件,结合MSVC链接器参数/DEF:exports.def /EXPORT:NONE,使用NONAME关键字强制序数导出。步骤包括:配置cdylib项目、编写#[no_mangle]函数、创建.def文件分配序号、设置链接参数,最后验证生成仅包含序数导出的DLL。该方法仅适用于MSVC工具链,可有效保护内部符号名称,调用方需通过GetProcAddress按序数加载函数。原创 2025-08-17 23:08:01 · 624 阅读 · 0 评论 -
Rust:DLL 输出对象的生命周期管理
本文介绍了在Rust开发DLL时安全传递对象地址给C语言的完整方案。核心是通过Box::into_raw泄漏所有权,由C调用方显式管理生命周期,并提供销毁函数。示例展示了一个线程安全的计数器实现,使用Mutex保证内部可变性。关键措施包括:所有权转移协议、空指针检查、FFI兼容内存布局(repr(C))。同时建议使用RAII封装管理生命周期、避免跨DLL析构、保持版本兼容性。对于共享所有权场景,可选用Arc引用计数方案。最佳实践推荐使用abi_stable库、自动化测试工具和内存分析工具来确保安全性。原创 2025-08-17 13:33:33 · 440 阅读 · 0 评论 -
Rust 中 &i32 与 *i32 的深度解析
Rust 中 &i32 和 *i32 是两种关键指针类型,存在本质区别。&i32 是安全的引用,由编译器保证内存安全,自动管理生命周期,禁止空值,严格遵循借用规则;而 *i32 是不安全的裸指针,需要手动管理,允许空值,主要用于 FFI 和底层操作,必须在 unsafe 块中使用。虽然 &i32 可安全转换为 *i32,但反向转换需要显式不安全操作。日常开发应优先使用 &i32,仅在特定场景(如 C 交互或极端性能优化)才考虑 *i32。原创 2025-08-15 22:24:41 · 1232 阅读 · 4 评论 -
Delphi7:THashedStringList 详细用法指南
THashedStringList 是 Delphi 中基于哈希表的高效字符串列表类,相比 TStringList 提供 O(1) 时间复杂度的快速查找能力。摘要内容包含:1) 基本创建和键值对操作;2) 高级功能如自定义分隔符和哈希函数;3) 性能优化技巧;4) 典型应用场景如配置解析和缓存系统;5) 常见问题解决方案。特别适合处理大型数据集(1000+项)和需要频繁查找的字符串操作,但需注意其不支持排序功能,可通过临时 TStringList 实现排序需求。原创 2025-08-15 15:26:22 · 550 阅读 · 1 评论 -
Rust:构造函数 new() 如何进行错误处理?
Rust 中 new() 方法的错误处理主要有三种方式:1) 返回 Result<T,E>(推荐处理可恢复错误),2) 使用 panic!(仅适用于不可恢复错误),3) 返回 Option<T>(简化处理)。最佳实践是根据场景选择方案:Result 适合需要详细错误信息的输入校验,panic! 用于代码逻辑错误,Option 适用于简单存在性检查。关键原则是显式处理错误、避免隐藏错误,并利用类型系统和错误 trait(如 thiserror)提升代码健壮性。原创 2025-08-12 17:29:28 · 315 阅读 · 0 评论 -
Rust:专业级错误处理工具 thiserror 详解
Rust错误处理库thiserror详解:专为库开发设计,支持自定义错误类型和自动特征实现。通过#[derive(Error)]宏可快速定义包含格式化错误信息、错误来源和回溯的枚举或结构体错误类型。相比anyhow更适合需要精确错误控制的场景,支持模式匹配和高效错误处理。文章涵盖安装、核心功能、属性详解、最佳实践及与anyhow的对比,是库开发者提升错误处理能力的实用指南。原创 2025-08-11 17:07:03 · 1239 阅读 · 0 评论 -
Rust 库开发全面指南
/!这是一个数学计算库//!//!提供各种数学计算功能/// 计算两个数的和////// # 示例/// ```////// ```a + b/// 计算阶乘/// 自定义错误类型/// 安全除法} else {Ok(a / b)原创 2025-08-11 14:08:54 · 676 阅读 · 0 评论 -
Delphi:TList/TObjectList 设计中的 Notify 设计范式
Delphi中的TList/TObjectList采用混合设计模式实现灵活的集合管理。其核心是Notify方法,结合了观察者模式(状态变更时通知)和模板方法模式(父类定义流程,子类扩展行为)。当列表执行删除等操作时,自动触发Notify通知,子类TObjectList可重写该方法实现对象释放等定制逻辑。这种设计遵循开闭原则,通过虚方法扩展功能而不修改基类,同时保持职责分离——基类管理数据结构,子类处理业务逻辑。实际实现中需注意操作顺序,先处理业务逻辑再调用父类方法,避免访问已释放内存。这种模式在多种框架中广原创 2025-08-09 18:46:25 · 1309 阅读 · 0 评论 -
三层设计架构,数据层对表现层的不可见性意味着数据类型定义不可见吗?
在三层设计架构中,数据层(通常也称为数据访问层或DAL)对表现层(UI层)的“不可见性”主要指的是数据层的具体实现细节,包括数据访问逻辑、数据库连接字符串、SQL查询语句等,以及数据层的变量和函数(除非通过业务逻辑层进行间接访问)对表现层是不可见的。然而,数据类型定义(如实体类、数据传输对象DTO等)通常是可以在各层之间共享的。这些定义提供了数据在不同层次之间传递的结构和格式,使得业务逻辑层可以将数据从数据层传递到表现层,或者将表现层的数据传递到业务逻辑层进行处理,然后再传递到数据层进行存储。原创 2025-01-06 16:38:27 · 385 阅读 · 0 评论 -
多层设计模式:可否设计各层之间公用的数据定义模块?
在多层程序设计模式中,可以设计一个各层之间公用的数据类型定义模块。这种模块通常被称为“公共模块”或“共享模块”,它包含所有层都需要使用的数据类型定义。这有助于确保数据在不同层之间传递时的一致性和准确性。通过设计一个各层之间公用的数据类型定义模块,可以提高多层程序设计模式的可维护性、可扩展性和可重用性。这有助于确保数据在不同层之间传递时的一致性和准确性,同时减少层之间的依赖和复杂性。原创 2025-01-03 18:40:55 · 624 阅读 · 0 评论 -
原子操作与无锁编程
原子操作指的是由多步操作组成的一个操作,如果该操作不能原子地执行,则要么执行完所有步骤,要么一步也不执行,不可能只执行所有步骤的一个子集。原子操作是不可分割的,在执行完毕时它不会被任何事件中断。原创 2024-11-17 17:33:51 · 965 阅读 · 0 评论 -
Rust:启动与关闭线程
在 Rust 编程中,启动和关闭线程是并发编程的重要部分。Rust 提供了强大的线程支持,允许你轻松地创建和管理线程。下面将详细解释如何在 Rust 中启动和关闭线程。原创 2024-11-08 17:59:05 · 997 阅读 · 0 评论 -
推荐的程序员发表博客的网站
其博客频道是国内领先的IT原创文章分享及交流平台,百度收录效果好,编辑器也是自主开发的,反馈响应快。对于程序员来说,发表博客文章是一个很好的方式来分享知识、经验和见解,同时也是提升个人品牌和影响力的重要途径。:SegmentFault是一个专注于开发者社区建设的技术问答平台,同时也支持博客文章的发表。不过需要注意的是,这些平台可能需要英文写作,对于英文水平较高的程序员来说是一个不错的选择。:开源中国是目前国内最大的开源技术社区,提供了发现、使用和交流开源技术的平台。原创 2024-08-14 16:25:35 · 3218 阅读 · 0 评论 -
基于事件的架构工作机制和相关产品
同样,事件的接收者(消费者)也不需要知道事件是从哪里来的,它只需要关注自己感兴趣的事件类型,并在这些事件发生时作出响应。区别在于,基于事件的架构只是把这个请求发出,并不急于得到结果,而是等合适的子系统处理完这个请求,发出Reply(Add(123,456)),最初的请求者再通过事件代理或中介处取回自己想要的结。上述理解捕捉到了EDA的一些核心特性,但需要注意的是,在EDA中,事件的发送和处理通常是异步和解耦的,而且通常不会有一个直接的回复机制来连接事件的发送者和接收者。原创 2024-05-28 15:46:59 · 1154 阅读 · 0 评论 -
企业服务总线(Enterprise Service Bus,ESB)简介
它提供了一个灵活的基础设施,用于连接、路由和中介不同服务之间的消息,从而实现服务的解耦、复用和灵活组合。定制开发可以提供更大的灵活性,但需要投入更多的人力和时间资源,并且需要自行负责后续的维护和升级工作。这些系统可能是在不同的时间点由不同的团队使用不同的技术栈开发的。在这个例子中,ESB充当了各个系统之间的“交通枢纽”,简化了系统间的集成和交互复杂性,提高了业务流程的灵活性和可扩展性。企业服务总线(ESB)的实现方式可以是选择专门的产品,也可以是定制开发,具体取决于企业的具体需求和现有技术架构。原创 2024-05-28 15:36:09 · 1377 阅读 · 0 评论 -
SOA 与“微服务”的区别
综上所述,SOA和微服务在服务粒度、通信方式、交付要求、应用场景以及服务管理和部署等方面存在显著差异。这些差异使得两者在各自适合的场景中发挥着不同的优势。SOA(面向服务的架构)与微服务之间的区别可以从多个维度进行分析。原创 2024-05-28 15:27:23 · 615 阅读 · 0 评论 -
SOA 并不是一个单纯的 API
这个面向服务的架构虽然包含了多个提供API的服务,但它本身并不等同于一个简单的API,而是一个更复杂的系统架构。:一个大型企业构建了一个面向服务的架构,其中包含多个独立的服务,如用户管理服务、订单处理服务、库存管理服务等。:考虑一个简单的天气预报API,它允许开发者通过HTTP请求获取特定城市的天气信息。因此,这个天气预报API虽然是一个有用的接口,但并不构成一个SOA架构。原创 2024-05-28 15:24:15 · 451 阅读 · 0 评论 -
无状态程序设计的本质
这样,大部分数据是共享的,只有变化的部分是新建的。换句话说,如果把请求和数据库的内容都看作系统的输入,那么系统的输出(即请求的处理结果)应该只与这些输入有关,而不依赖于任何其他外部状态或之前的请求历史。综上所述,虽然纯粹的无状态的函数式程序设计在表面上看起来无法在内存中保存数据,但实际上通过闭包、Monads、持久数据结构等机制,可以在不违反函数式编程原则的前提下模拟和处理状态。在无状态设计中,系统的行为只取决于当前的请求内容和数据库的当前状态,而不依赖于之前的请求历史或会话状态。原创 2024-05-28 15:08:33 · 1938 阅读 · 0 评论 -
RAII:让资源管理变得轻松自如
简单来说,它就是把资源的生命周期和对象的生命周期绑定在一起,确保资源能够正确管理和回收。RAII的好处可不少!首先,它让资源管理变得自动化,你无需手动去申请和释放资源,减少了出错的机会。其次,即使程序出现异常或错误,RAII也能确保资源被正确释放,让你的代码更加安全。最后,有了RAII,你可以更专注于实现程序的功能逻辑,而不用被资源管理问题所困扰。通过将资源的获取和释放与对象的生命周期绑定在一起,它简化了资源管理过程并提高了代码的安全性和可靠性。类,它的构造函数会尝试打开一个文件,并在析构函数中关闭文件。原创 2024-05-14 12:36:50 · 415 阅读 · 0 评论 -
Rust的协程机制:原理与简单示例
在现代编程中,协程(Coroutine)已经成为实现高效并发的重要工具。Rust,作为一种内存安全的系统编程语言,也采用了协程作为其并发模型的一部分。本文将深入探讨Rust协程机制的实现原理,并通过一个简单的示例来展示其使用方法。原创 2024-05-11 23:39:32 · 1904 阅读 · 0 评论 -
MVC:一种设计模式而非软件架构
然而,重要的是要理解MVC是一种设计模式,而不是整个软件的架构。软件架构关注的是系统的全局结构和设计原则,以及如何将系统分解为可管理的部分,并定义这些部分之间的交互方式。软件架构是一个更广泛的概念,它涉及整个软件系统的结构和设计,包括系统的各个组件、组件之间的关系以及系统的整体行为。:作为模型和视图之间的中介,负责接收用户的输入,并调用相应的模型处理数据,然后更新视图。MVC设计模式的核心思想是将数据和数据的展示分离开来,使得数据的处理逻辑和用户界面的变化可以独立演进,互不干扰。原创 2024-05-11 22:49:43 · 457 阅读 · 0 评论
分享