- 博客(390)
- 收藏
- 关注
原创 Java Grails 实战详解:用 Groovy 和 GORM 快速开发 Web 应用
Grails 是一个基于 Groovy 语言的 JVM 全栈 Web 开发框架,整合了 Spring Boot、Hibernate 等核心技术,强调"约定优于配置"理念。它适合快速开发 CRUD 系统、后台管理、REST API 等场景,能显著提升开发效率。相比 Spring Boot,Grails 提供更完整的开发套件,包括 GORM、脚手架和插件体系。项目结构遵循特定约定,自动识别控制器、服务和领域模型。新版本(如 Grails 8)支持 Spring Boot 4 和 JDK 21。通过简单的 CLI
2026-07-29 10:01:59
11
原创 Java Picocli 实战详解:用注解写出好用的命令行工具
Picocli 是 Java 生态中一个强大的命令行工具开发库,通过注解简化参数解析和命令构建。它支持选项(-f/--file)、位置参数、子命令、自动类型转换、帮助文档生成等功能,适合开发各种命令行工具(如开发者工具、运维脚本等)。示例演示了如何用 Picocli 创建简单的问候命令和文件统计工具,展示了核心注解(@Command, @Option, @Parameters)的用法。相比手动解析参数,Picocli 提供更规范、可维护的解决方案,并能自动处理帮助文档、版本信息等通用需求。
2026-07-28 14:20:43
181
原创 Java Undertow 实战指南:从轻量 Web Server 到 Spring Boot 嵌入式容器
文章摘要 Undertow是一个轻量级Java Web服务器,可作为HTTP服务器、Servlet容器和WebSocket支持。它比Tomcat更轻量,适合嵌入式场景,提供灵活的Handler API直接处理HTTP请求。核心模块包括undertow-core(HTTP核心)、undertow-servlet(Servlet支持)和undertow-websockets-jsr(WebSocket)。虽然Spring Boot 3支持Undertow,但Spring Boot 4已移除支持。典型使用场景包括
2026-07-27 07:45:41
169
原创 Java Jetty 实战详解:从嵌入式 HTTP 服务到 Spring Boot 容器替换
Jetty是一个由Eclipse基金会维护的Java Web服务器和Servlet容器,支持HTTP请求处理、Servlet运行、WAR包部署及WebSocket等协议。其突出特点是嵌入式设计和可编程性,适用于嵌入式HTTP服务、REST API、微服务等场景。与Tomcat相比,Jetty更侧重嵌入式和工具类应用,而Tomcat常见于传统Web项目。Jetty版本选择需匹配Java和EE规范,新项目推荐Jetty 12.0.x+Java 17+Jakarta EE 10。Jetty支持独立部署和嵌入式启动
2026-07-25 07:48:17
203
1
原创 Java Jersey 实战指南:用 JAX-RS 注解写清晰的 REST API
摘要 Jersey是Jakarta RESTful Web Services(原JAX-RS)规范的标准实现,适用于构建REST API。它通过注解(如@Path、@GET)将Java类声明为HTTP资源,与Spring MVC的Controller类似但使用不同注解。Jersey适合需要标准REST资源模型、兼容Jakarta EE或偏好JAX-RS编程风格的项目。 在Spring Boot中集成Jersey只需引入spring-boot-starter-jersey依赖,并通过ResourceConfi
2026-07-24 07:39:34
230
原创 Java Spring Security 实战详解:从登录认证到 JWT 权限控制
本文介绍了Spring Security框架的核心功能和实现方式。Spring Security主要解决认证、授权和安全防护三大问题,通过过滤器链处理请求安全。文章详细讲解了Authentication(认证)和Authorization(授权)的概念,并展示了请求在Spring Security中的处理流程。针对Spring Boot 3和Spring Security 6,提供了一个基于内存用户的最小可运行Demo,包含两个预定义用户(admin和tom)及其角色权限配置。示例代码展示了如何配置Secu
2026-07-23 09:30:36
237
原创 Java Gradle 实战指南:从 Wrapper、Kotlin DSL 到 Spring Boot 多模块构建
Gradle 是一个灵活、可扩展的现代构建工具,主要用于 Java 项目的构建管理。它通过插件提供构建能力,使用任务组织构建动作,并以 DSL 描述配置。相比 Maven,Gradle 更具灵活性,支持增量构建和多模块工程。项目通常使用 Gradle Wrapper 固定构建版本,确保一致性。Gradle 运行需要 JDK 17+,但可通过 Java Toolchain 指定项目编译 JDK。标准项目包含 settings.gradle.kts(项目配置)、build.gradle.kts(构建脚本)等文件
2026-07-21 10:10:55
205
原创 Java Kafka 实战指南:从 Topic、分区到 Spring Boot 可靠消息处理
Kafka 分布式事件流平台简介 Kafka是一个高吞吐的分布式事件流平台,主要用于异步处理大量事件数据(如订单、日志等)。其核心架构包括生产者、Topic、分区和消费者组,通过分区实现并行处理和负载均衡。Kafka以追加日志方式存储消息,允许多个消费者组独立消费同一批数据。典型应用场景包括系统解耦、削峰填谷、数据管道和实时计算。Kafka保证单个分区内消息有序,可通过消息键确保业务顺序。本地开发可使用Docker快速搭建单节点环境,支持原生Java客户端和Spring集成两种开发方式。
2026-07-20 17:20:57
260
原创 Java Netty 实战指南:从 NIO 线程模型到 TCP 编解码和心跳机制
Netty是一个高性能Java网络通信框架,封装了NIO的复杂细节,适用于高并发、长连接场景如RPC、IM、游戏服务器等。其核心组件包括Bootstrap、EventLoop、Channel和Pipeline,采用事件驱动模型,每个Channel对应一个线程处理I/O事件。本文通过一个TCP示例演示了按行收发消息的实现,使用LineBasedFrameDecoder解决粘包问题,并强调耗时操作应避免阻塞EventLoop线程。Netty简化了网络编程,适合作为自定义协议和实时系统的底层通信框架。
2026-07-19 10:54:47
195
原创 Java Neo4j 实战指南:从图模型、Cypher 到 Spring Boot 关系查询
本文介绍了Neo4j图数据库的核心概念与应用场景。Neo4j通过节点和关系直接建模数据连接,特别适合处理社交网络、推荐系统等关系密集型数据。文章对比了关系型数据库与图数据库在多层关系查询上的差异,展示了Neo4j的路径查询优势。 核心内容包括: Neo4j基本概念:节点、标签、关系、属性 使用Docker快速搭建开发环境 Cypher查询语言基础语法(CRUD操作) Java Driver的集成与基本用法 文中提供了具体的Cypher示例和Java代码片段,帮助开发者快速上手Neo4j在图数据建模和查询方面
2026-07-18 15:08:18
233
原创 Java Jakarta Validation 实战指南:从参数校验到分组、自定义注解和全局异常处理
Jakarta Validation是Java生态中的数据校验标准规范,通过注解方式在模型类上定义校验规则(如@NotBlank、@Email等),结合Hibernate Validator实现校验逻辑,并由Spring Boot集成到Web请求流程中。开发时只需在Controller方法参数添加@Valid注解即可自动触发校验,无需手动编写if判断。常用校验注解包括非空检查(@NotNull)、字符串格式(@Pattern)、数值范围(@Min/Max)、日期(@Past)等,能有效减少重复校验代码。Sp
2026-07-16 13:39:30
228
原创 Java SLF4J 实战指南:从日志门面到 Logback、MDC 和链路追踪
摘要 SLF4J是Java中常用的日志门面框架,提供统一API解耦业务代码与日志实现(如Logback、Log4j2)。它通过{}占位符优化日志输出,支持多级别日志(TRACE至ERROR)。关键优势在于: 应用代码只依赖SLF4J接口 运行时绑定具体日志实现 推荐异常日志包含完整堆栈 2.x版本新增Fluent API支持结构化日志 Spring Boot项目通常默认集成SLF4J+Logback,无需额外配置。日志级别应根据场景合理选择,生产环境建议以INFO为主,DEBUG仅用于问题排查。
2026-07-15 18:00:06
192
原创 看懂 IL 的关键:C#.NET 栈机执行模型实战拆解
摘要 .NET IL(中间语言)采用栈机模型,其核心在于通过计算栈隐式操作数据。与C#显式变量和表达式不同,IL指令(如add)默认从栈顶弹出操作数并压回结果。例如,ldarg.0和ldarg.1依次加载参数到栈顶,add执行加法后栈顶仅存结果。实例方法中ldarg.0代表this,后续参数从ldarg.1开始。方法调用时,参数按顺序压栈,返回值由ret从栈顶获取。计算栈、调用栈和托管堆是三个关键概念,分别用于临时数据、方法调用链和对象存储。理解栈机模型是解读IL的关键,需始终关注指令对计算栈的影响。
2026-07-14 13:37:06
186
原创 别再把 Util 类堆成杂物间:Kotlin Extension 扩展函数与扩展属性实战详解
Kotlin Extension 简明指南 Kotlin Extension 允许为现有类添加新方法而不修改其源代码,本质上仍是静态函数但调用方式更自然。关键特性包括: 语法结构:fun 接收者类型.扩展函数(),如 String.isEmail() 本质原理:编译后转为普通静态函数,接收者作为首个参数 典型应用: 封装类型相关的工具方法(如字符串处理、日期格式化) 简化业务逻辑(如订单状态展示) 为可空类型提供兜底操作 优势: 代码组织更符合直觉 支持泛型扩展(如集合工具方法) 可空接收者处理更优雅 注意
2026-07-10 07:59:48
216
原创 别把 CLI 写成一坨 os.Args:Go Cobra 从命令树到实战工具详解
本文介绍了如何使用Go的Cobra库构建命令行工具。Cobra通过命令树结构组织子命令、参数和校验逻辑,解决了复杂CLI工具的常见问题。文章对比了标准库与Cobra的实现差异,详细讲解了Command、Args、Flag三个核心概念,以及本地/持久Flag、参数校验等关键特性。最后通过一个完整的todoctl待办事项工具示例,展示了Cobra在实际项目中的应用,包括命令组织、错误处理和数据存储等实现细节。该框架特别适合需要多级子命令和复杂参数处理的CLI程序开发。
2026-07-09 07:47:53
177
原创 Java ActiveMQ 实战指南:从 JMS 队列、主题到 Spring Boot 消息处理
ActiveMQ 是 Apache 提供的 JMS 消息中间件,主要用于 Java 生态中的异步处理、系统解耦和任务分发。它支持点对点(Queue)和发布订阅(Topic)两种模式,适用于订单处理、短信通知等场景。ActiveMQ 分为 Classic(传统版本)和 Artemis(新一代高性能版本),老系统多使用 Classic 版本。与 RabbitMQ 相比,ActiveMQ 更专注于 JMS 规范,而 RabbitMQ 提供更灵活的路由功能。开发者可通过 Docker 快速搭建 ActiveMQ 环
2026-07-08 07:51:42
287
原创 Java RabbitMQ 实战指南:从交换机、队列到可靠消息处理
RabbitMQ是一个基于AMQP协议的消息队列中间件,主要用于异步处理、系统解耦、流量削峰和任务分发。核心概念包括生产者、消费者、交换机、队列和路由机制。RabbitMQ支持多种交换机类型(Direct、Fanout、Topic等),满足不同消息路由需求。通过Docker可快速搭建RabbitMQ环境,Java客户端可通过原生API实现消息生产和消费。典型应用场景如订单系统拆分,将短信、邮件等非核心逻辑异步处理,提升系统响应速度和稳定性。
2026-07-07 09:23:31
269
原创 Java Maven 实战指南:从 POM、依赖管理到多模块构建
Maven简介与核心功能 Maven是Java项目标准化的构建和依赖管理工具,通过pom.xml配置文件实现: 统一项目目录结构 自动下载管理依赖 标准化构建流程(编译、测试、打包、发布) 支持多模块项目管理 核心机制: 坐标系统(groupId/artifactId/version)唯一标识构件 本地/远程仓库管理依赖 生命周期控制构建顺序 插件执行具体任务 典型使用场景: 开发时通过mvn compile编译 测试时通过mvn test运行测试 打包时通过mvn package生成jar/war 支持M
2026-07-06 11:29:54
224
原创 Java Future 与 CompletableFuture 实战指南:从异步结果到任务编排
本文介绍了Java中的Future和CompletableFuture异步编程工具。Future是Java 5引入的异步结果占位符,通过get()方法阻塞获取任务结果,支持超时和取消操作,但功能较为基础。CompletableFuture是Java 8增强的异步编程工具,实现了链式调用和任务编排功能,支持结果转换、异常处理、多任务组合等高级特性。两者的核心区别在于Future适合接收单个异步任务结果,而CompletableFuture更适合编排一组异步任务流程,提供了更灵活的异步编程范式。
2026-07-05 16:30:51
174
原创 别再只会 if err != nil:Go error 从错误链到工程实战详解
Go 错误处理最佳实践摘要(150字) Go采用显式错误处理,通过error接口和返回值传递错误。核心原则包括: 错误应携带上下文,使用fmt.Errorf包装(%w)或自定义错误类型 比较错误用errors.Is检查哨兵错误,errors.As提取结构化错误 错误处理应靠近错误源,保持主逻辑清晰 分层包装错误形成调用链,保留原始错误信息 日志记录通常在调用链最上层进行 简单错误用errors.New,需程序识别的定义哨兵错误 关键点:错误是值而非异常,应通过组合和包装保持可追溯性,同时提供足够的诊断信息。
2026-07-04 07:47:42
185
原创 Kotlin 运算符重载详解:为什么 a += b 有时改对象,有时换对象?
本文介绍了Kotlin的运算符重载机制,通过固定运算符与特定函数名的映射关系,让自定义类支持运算符操作。文章首先展示了运算符重载的基本原理,指出像+、in等运算符实际上对应着plus()、contains()等成员函数。然后通过一个二维坐标点Point类的示例,演示如何通过实现operator fun plus()来支持+运算。文中还列出了常用运算符的映射表,包括一元运算符、算术运算、区间判断、索引访问等,并强调了运算符重载不能改变运算优先级。最后以金融场景的Money类为例,展示了金额计算如何通过重载运算
2026-07-03 14:29:32
205
原创 别再把类型断言当强制转换:Go 从 comma-ok 到 type switch 实战详解
Go 类型断言与类型转换对比摘要 Go 语言中,类型断言 value.(T) 用于检查接口值的动态类型,而类型转换 T(value) 用于在不同类型间转换值。 关键区别: 类型断言:检查接口值内部存储的实际类型,匹配则返回值,否则 panic 或返回失败标志 类型转换:在允许转换的类型间改变值的表示形式 主要特点: 类型断言必须作用于接口值,类型转换适用于基础类型 断言目标类型必须精确匹配(包括指针类型和自定义类型) 推荐使用双返回值形式 val, ok := iface.(T) 避免 panic 多种类型
2026-07-02 11:23:43
212
原创 别再把 inline 当性能开关:Kotlin 内联、noinline、crossinline 与 reified 实战详解
Kotlin 的 inline 关键字专为高阶函数设计,核心作用是在编译期展开函数体和 Lambda 代码。它不仅减少函数调用开销,更关键的是改变 Lambda 的行为:支持非局部返回与 reified 泛型。内联适合短小高频调用的流程封装(如标准库函数),但需避免滥用——大函数或非必要场景会导致代码膨胀。典型应用包括统一日志/耗时处理模板,以及利用非局部返回简化循环控制。合理使用 inline 能提升性能与编码体验,但需权衡代码体积与维护成本。
2026-07-01 09:47:44
154
原创 别再只会用 cron:Linux systemd Timer 定时任务实战详解
文章摘要: Linux定时任务通常使用cron,但复杂任务(如日志、依赖管理)可能难以维护。systemd Timer提供了更灵活的替代方案,将定时触发(.timer)与任务执行(.service)分离,并集成systemd的服务管理能力(如日志、权限控制)。Timer支持日历时间(如OnCalendar=daily)和单调时间(如OnBootSec=5min),还能处理补跑、随机延迟等场景。与cron相比,Timer更适合需要精细控制的系统服务,而简单任务仍可用cron。最小示例展示了每分钟输出时间的实现
2026-06-30 07:47:26
160
原创 别把泛型写复杂了:Go generic 从类型参数到实战封装
Go 1.18 引入的泛型特性允许开发者编写更通用且类型安全的代码。泛型的核心思想是将类型作为参数传递,使同一套逻辑能适配多种类型。通过类型参数和约束(如 any、comparable 或自定义约束),可以避免重复编写功能相似但类型不同的代码。例如,求和函数 Sum 可以同时处理 int、float64 等类型。泛型还支持类型推断,简化调用方式。内置约束 comparable 确保类型可比较,适用于查找函数或 map 操作。泛型提升了代码复用性和类型安全性,是 Go 语言的重要增强。
2026-06-29 08:07:21
176
原创 MySQL JSON 实战详解:从存储、查询、更新到 JSON_TABLE 与索引
MySQL从5.7.8开始支持原生JSON数据类型,适合存储结构灵活但需要查询修改的数据,如商品属性、用户配置等。相比TEXT类型,JSON会自动校验格式、支持二进制存储和路径操作,并能通过生成列建立索引。 JSON适用于结构不固定、查询频率较低的数据(如商品扩展属性),而核心业务字段(如价格、状态)仍应使用普通列。创建JSON字段时可使用JSON_OBJECT()和JSON_ARRAY()函数构造数据,并通过JSON_EXTRACT(->)和->>操作符提取值,后者会去掉字符串引号。 示例演示了如何在商品
2026-06-28 09:56:45
244
原创 推荐一个 Zig Web 工程骨架:wing-app
这篇文章介绍了基于 Zig 语言的 Web 开发骨架项目 wing-app,它整合了 Zig 生态中的 zio、talon、wing 和 mantle 等组件,提供了一个可直接用于实际开发的工程化模板。不同于简单的"Hello World"示例,wing-app 解决了 Web 开发中的多个工程问题,包括路由组织、分层架构、配置管理、数据库连接、认证授权和 API 文档生成等。项目采用清晰的分层结构(controller-service-repository)和显式依赖管理,通过编译期机制实现高效的路由和类
2026-06-27 08:50:20
316
原创 Java 虚拟线程实战指南:从 Thread API 到 Spring Boot 高并发应用
Java 21引入了虚拟线程(Virtual Thread),这是Project Loom提供的轻量级线程实现。虚拟线程与传统平台线程不同,它不固定绑定操作系统线程,而是由JVM动态调度到少量平台线程上执行。当虚拟线程遇到I/O阻塞时,JVM会自动挂起并释放底层线程,提高并发处理能力。虚拟线程特别适合处理大量I/O密集型任务(如数据库访问、HTTP调用),能显著提升系统吞吐量,但对CPU密集型任务性能提升有限。创建方式包括Thread.startVirtualThread()、Thread.ofVirtua
2026-06-26 07:22:41
241
原创 Java Spring WebFlux 实战指南:用 Mono、Flux 和 WebClient 写响应式接口
摘要 Spring WebFlux 是 Spring 5 引入的响应式 Web 框架,采用非阻塞异步模型处理请求,适合高并发 I/O 场景。与传统的 Spring MVC 相比,WebFlux 基于 Reactive Streams,使用少量线程处理大量请求,特别适用于网关转发、流式接口和响应式数据访问。核心编程模型围绕 Mono(0/1个结果)和 Flux(0-N个结果)展开,提供丰富的操作符如 map、flatMap 处理异步数据流。典型应用场景包括高并发远程调用、SSE推送和 WebSocket,但不
2026-06-25 07:18:32
233
原创 线程不是越多越快:C#.NET Thread 生命周期、同步与后台工作线程实战
摘要 Thread 是 .NET 中直接管理线程的底层 API,适用于需要专用线程的场景,如长期独占、阻塞式任务。线程共享进程资源但拥有独立的执行状态。Thread 不同于 Task 和 async/await,后者更适合异步 I/O 和短任务。 使用 Thread 时,可通过 Start() 启动线程,Join() 等待完成,并通过 Lambda 传递参数。线程默认是前台线程,会阻止进程退出,而设置 IsBackground = true 可改为后台线程。 适用场景: 长期工作线程 阻塞式 API 调用
2026-06-24 11:25:28
221
原创 别只会反射:C#.NET Emit 动态生成代码实战详解
文章摘要: Emit 是 .NET 中的底层 API(System.Reflection.Emit),用于运行时动态生成 IL 代码、类型、方法等,适用于框架底层和高性能场景(如 ORM、序列化、动态代理)。与反射不同,Emit 主动生成代码而非调用现有结构,性能更高但复杂度较大。核心类包括 DynamicMethod、ILGenerator 等,需理解 IL 的栈式执行模型。示例演示了动态生成加法方法、属性访问器等,体现其“运行时手写 IL”的能力。相比编译期代码生成(如源生成器),Emit 更灵活,适合
2026-06-23 13:41:09
217
原创 Kotlin Context Parameters 详解:别再把 Logger、事务和配置层层往下传
Kotlin Context Parameters 是一种编译期隐式参数机制,旨在减少多层函数调用中重复传递的"环境参数"(如Logger、配置、数据库事务等)。它通过context声明函数所需的上下文对象,调用时编译器自动匹配当前作用域中的对应实例,无需手动传递。从Kotlin 2.4.0开始稳定支持,可显著简化代码结构,同时保持类型安全——缺少上下文时会直接编译报错。典型应用场景包括日志、配置、数据库等跨层级共享对象,使业务函数只关注核心参数,提升代码可读性。调用时可使用context{...}块或wi
2026-06-22 11:21:31
243
原创 别再把 interface 当万能盒子:Go 接口从隐式实现到项目解耦
Go语言中的接口(interface)是一种定义行为约定的类型,只声明方法而不包含字段或具体实现。接口通过方法集合描述类型的能力,任何实现了这些方法的类型都隐式满足该接口,无需显式声明。文章通过示例展示了接口的基本用法,包括定义、实现、类型断言和类型选择,并解释了接口变量存储的动态类型与值。同时指出了接口的常见陷阱(如nil判断问题)以及值/指针接收者对接口实现的影响。空接口interface{}(或any)可接受任意类型,但会丢失类型信息。Go的接口设计强调解耦,让实现与定义分离,提高了代码的灵活性。
2026-06-21 09:09:32
236
原创 别再乱用 StartNew:C#.NET TaskFactory 任务调度实战详解
TaskFactory是.NET中用于创建和调度Task的工厂类。它比Task.Run提供更精细的控制,适合需要指定TaskScheduler、TaskCreationOptions、CancellationToken等场景。本文介绍了TaskFactory的核心功能,包括StartNew、ContinueWhenAll/Any、FromAsync等方法,并通过订单报表生成Demo演示了基础用法、取消任务、LongRunning选项等常见场景。作者建议:普通后台任务优先用Task.Run,只有需要高级控制时
2026-06-20 16:26:47
222
原创 Java JDBC 实战指南:从 Connection 到事务和连接池
本文介绍了JDBC(Java Database Connectivity)的基本概念及其在Java数据库编程中的核心作用。JDBC是Java访问关系型数据库的标准API,负责连接数据库、执行SQL、处理结果和控制事务。文章阐述了JDBC与常见框架(如MyBatis、JPA等)的关系,详细说明了核心接口(Connection、PreparedStatement、ResultSet等)的功能,并提供了MySQL驱动的Maven依赖配置。通过一个查询示例,展示了JDBC的标准使用流程,强调了使用PreparedS
2026-06-19 11:18:36
251
原创 Java Tomcat 实战指南:从 Servlet 容器到 Spring Boot 部署
Apache Tomcat 是一个轻量级的 Java Web 服务器和 Servlet 容器,主要用于运行 Java Web 应用,处理 HTTP 请求并调用 Servlet/Filter/Listener。它常与 Nginx 配合使用,Nginx 负责静态资源和反向代理,Tomcat 处理动态请求。Tomcat 9 适用于 Java 8 和老项目(使用 javax.servlet),而 Tomcat 10/11 适用于新项目(使用 jakarta.servlet),分别对应 Spring Boot 2 和
2026-06-18 14:43:27
263
原创 Java Flyway 实战指南:用 SQL 脚本管理数据库版本
Flyway是一个数据库迁移工具,通过SQL文件管理数据库变更,解决数据库结构随项目版本演进的问题。它适合需要SQL管理表结构、多环境数据库一致、自动执行变更等场景,常与ORM工具搭配使用。核心流程包括扫描脚本、检查历史表、执行未运行脚本并记录结果。Spring Boot项目中只需简单配置即可自动集成,推荐将版本化SQL脚本(如V1__create_table.sql)放在resources/db/migration目录下。Flyway通过历史表跟踪执行状态,避免重复运行,适用于建表、改表、初始化数据等操作
2026-06-17 06:51:30
266
原创 别再怕指针:Go pointer 从地址到实战用法
Go语言指针基础摘要: 指针是保存变量内存地址的变量,通过地址访问或修改原值。核心操作符&取地址,*解引用。Go指针特点: 无指针运算,比C更安全 指针类型需匹配(如*int) 零值为nil,解引用前需判空 new()可创建非nil指针 使用场景: 函数参数需修改原值时传指针 结构体常用指针接收者方法 大对象避免值拷贝 注意: 值接收者操作副本,指针接收者操作原对象 方法调用时Go会自动处理可取地址变量的指针转换
2026-06-16 09:52:46
213
原创 Kotlin with 详解:把已有对象放进作用域集中处理
Kotlin 的 with 函数是一个作用域函数,用于在指定对象的作用域内执行代码块并返回结果。摘要如下: 功能定位:with 接受一个对象作为参数,在该对象的作用域中执行 Lambda 表达式,并返回最后一行的结果。 典型场景:适合对已有对象进行连续属性访问/方法调用(如生成报表、格式化文本等)。 源码特点:非扩展函数,通过 receiver.block() 实现对象作用域内的代码执行。 与 run 的区别:功能相似,但调用方式不同(with(obj) vs obj.run),且 with 不支持可空对象
2026-06-15 09:55:29
242
原创 Java Liquibase 实战指南:让数据库变更像代码一样可追踪
Liquibase是一个数据库变更管理工具,主要用于跟踪和管理数据库结构演进,如创建表、添加字段、初始化数据等。它通过将变更记录在版本控制的文件中,确保不同环境的数据库结构一致,并支持变更追踪和回滚。Liquibase与ORM工具(如MyBatis、JPA)分工明确,前者管理表结构,后者处理业务数据操作。在Spring Boot项目中,Liquibase通过自动检查并执行未应用的变更(记录在DATABASECHANGELOG表中),结合合理的目录结构和配置(如主changelog文件组织版本变更),实现数据
2026-06-14 10:24:40
202
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅