编程 Swift 6.3 深度解析:官方 Android SDK 来了,Swift 的「全栈大一统」野望

2026-04-12 18:25:53 +0800 CST views 7

Swift 6.3 深度解析:官方 Android SDK 来了,Swift 的「全栈大一统」野望

前言

2026年3月24日,Swift 团队正式发布了 Swift 6.3。这是自 Swift 6.0 引入完整并发安全以来最大的一次跨平台版本更新。比起以往聚焦于 Apple 生态的迭代节奏,Swift 6.3 的野心明显更大:它带来了首个官方 Android SDK、全面增强的 C 互操作能力、统一跨平台构建系统,以及嵌入式场景的深度优化。

如果你还停留在「Swift = iOS/macOS 开发语言」的认知里,是时候刷新一下了。这一版本的 Swift,正在悄然向「一门语言贯穿全栈」的终局靠近——从微控制器固件、到 Linux 服务器、再到 Android 应用,Swift 6.3 正在把版图一块块拼齐。

这篇文章,我们来系统地拆解 Swift 6.3 的核心新特性,深入分析背后的工程设计逻辑,并给出实打实的代码示例,看看这些新能力到底怎么用、能解决什么问题。


一、从「Apple 御用」到「全平台语言」:Swift 的十年扩张路

1.1 Swift 的平台扩张时间线

理解 Swift 6.3 的意义,先要理解 Swift 这些年的扩张路径:

版本时间里程碑
Swift 3.02016跨平台支持 Linux,初步摆脱 Xcode 绑定
Swift 5.02019ABI 稳定,SwiftUI 开源,跨平台生态加速
Swift 5.92023嵌入式 Swift(Embedded Swift)正式登场,支持微控制器
Swift 6.02025完整并发安全(Complete Concurrency),数据隔离默认开启
Swift 6.32026.3官方 Android SDK,C 互操作重磅升级,统一构建系统预览

可以看到,每一代大版本都在往「全平台」的方向推进一步。但坦白说,在此之前,Swift 在非 Apple 平台的存在感还是比较弱的——Linux 上用 Swift 做服务端开发算小众,嵌入式 Swift 则是极客玩具,Android 开发者更是基本不会考虑 Swift。

Swift 6.3 改变了这个局面。

1.2 为什么 Android SDK 是这次最重磅的更新?

因为 Android 生态有一个 Swift 无法忽视的优势:存量代码规模。全球有数十亿台 Android 设备,大量的底层库(编解码、加密、网络协议栈)是用 C/C++ 写的。以往,Android 开发者要在原生层工作,首选是 Kotlin/JNI 或者直接用 C++。Swift 只能做旁观者。

现在,Swift 有了官方的 Android SDK,局面完全不同了:

  • 新的 Swift 包可以同时构建 Android 版本
  • 可以用 Swift/Java JNI Core 将 Swift 代码集成进现有 Kotlin/Java Android 应用
  • Swift 的内存安全和并发安全特性终于可以在 Android 原生层发挥作用

这意味着什么?Android 原生开发层,第一次有了一个与 Kotlin 并肩的强竞争者。不是上来就要「替代 Kotlin」,而是让团队在需要高性能、低级内存操作的场景下,多了一个 Swift 的选项。


二、@c 属性:C 互操作的范式革命

2.1 传统 C 互操作的问题

Swift 和 C 的互操作从 Swift 3 就存在了,但一直有一个痛点:双向调用不对称

  • Swift 调用 C:天然支持,可以直接 import C 模块
  • C 调用 Swift:需要间接手段,比如 bridging header 或者预先生成 C 头文件

在 Swift 6.3 之前,如果你想在 C 代码里调用 Swift 函数,过程相当繁琐:

  1. 要么把 Swift 函数标记为 @objc(但这引入 Apple 生态依赖)
  2. 要么手动维护一套 C 风格的 wrapper
  3. 要么依赖编译器内部实现,不够稳定

这导致在实际项目中,Swift 和 C 的边界往往是「单向通行」的。

2.2 @c 属性的核心语法

Swift 6.3 引入了 @c 属性来解决这个问题。用法非常直接:

// Swift 代码
@c
func callFromC() {
    print("Called from C!")
}

// 编译器会自动生成对应的 C 头文件声明:
// void callFromC(void);

编译器会生成一个与你模块名对应的 C 头文件,里面包含了用 @c 标记的函数声明。你只需要在 C/C++ 代码里 #include 这个头文件,就可以直接调用 Swift 函数。

2.3 自定义 C 函数名

如果你希望生成的 C 函数名与你 Swift 的函数名不同,可以用 @c 的参数化形式:

@c(MyLibrary_processData)
func processSwiftData(input: Int32) -> Int32 {
    return input * 2
}

// 生成的 C 声明:
// void MyLibrary_processData(int32_t input, int32_t *result);

这个能力非常实用。当你有多个 Swift 模块,每个模块都导出同名函数时,自定义 C 函数名就避免了符号冲突。

2.4 @c + @implementation:双向桥接

这是最强大的组合。@implementation 原本是用来在 Swift 中实现 C 头文件里声明的函数的(这个组合通常用于跨语言 FFI)。

// C 头文件 (some_header.h)
void computeSomething(int32_t input, int32_t *output);

// Swift 实现
@c @implementation
func computeSomething(_ input: Int32, _ output: UnsafeMutablePointer<Int32>) {
    output.pointee = input * input
}

@c@implementation 组合使用时,编译器会验证你的 Swift 函数是否与已有的 C 头文件声明完全匹配——参数类型、函数签名必须一致。这相当于在 Swift 和 C 之间建立了一个双向签名验证通道,编译期就能发现不匹配的错误,而不是等到运行时才发现。

2.5 工程实践:用 @c 重构遗留 C 库

一个典型的应用场景:假设你维护一个用 C 写的图像处理库,现在想逐步用 Swift 重写核心算法,但不想一次性大换血(风险太高)。

传统方案:要么全换,要么不动。

新方案:用 @c @implementation逐函数替换

// libimage.h (C)
#ifndef LIBIMAGE_H
#define LIBIMAGE_H

void image_rotate(double angle);
int image_scale(double factor);
const char* image_get_format(void);

#endif

// image_impl.swift (Swift 新实现)
@c @implementation
func image_rotate(_ angle: Double) {
    // Swift 实现的旋转算法
    ImageCore.rotate(byAngle: angle)
}

@c @implementation
func image_scale(_ factor: Double) -> Int32 {
    // Swift 实现的缩放算法
    let result = ImageCore.scale(byFactor: factor)
    return Int32(result)
}

@c @implementation
func image_get_format() -> UnsafePointer<CChar>? {
    return "RGBA".withCString { $0 }
}

这样,C 调用者完全无感,不需要任何修改。Swift 的安全特性(内存安全、溢出检查)同时生效,但 C 的调用约定完全保留。这就是「渐进式迁移」的工程意义。

2.6 为什么这不只是语法糖?

可能有读者觉得,这不就是加个装饰器让编译器多做一步处理吗?还真不只是。

更深层的意义在于:Swift 6.3 的 @c 属性建立了 Swift <-> C 之间的「类型系统对齐」机制。编译器不只是在生成头文件,它在类型层面做验证——Swift 的 Int32 映射到 C 的 int32_t,Swift 的 String 需要显式转为 UnsafePointer<CChar>,这些都是有编译器保证的。

在以往,这种验证靠人工维护 wrapper 代码,错误只能在运行时暴露。现在,编译期就能发现问题。


三、模块选择器:解决命名空间冲突的优雅方案

3.1 问题的起源

当你的项目依赖多个第三方库,而这些库恰好导出了同名类型或函数时,Swift 的命名空间冲突问题就来了。比如:

import ModuleA
import ModuleB

// 如果 ModuleA 和 ModuleB 都导出了 `getValue()` 呢?
let x = getValue()  // 编译器报错:Ambiguous use of 'getValue'

在 Swift 6.3 之前,解决这个问题要么靠模块重命名(依赖上游改动),要么用 typealias 手动消歧,要么重构自己的代码。都很痛苦。

3.2 模块选择器语法

Swift 6.3 引入的模块选择器,用 :: 操作符显式指定从哪个模块取符号:

import ModuleA
import ModuleB

let x = ModuleA::getValue()  // 调用 ModuleA 的 getValue
let y = ModuleB::getValue()  // 调用 ModuleB 的 getValue

这在 API 命名冲突时非常有用,尤其是在金融、医疗等依赖大量第三方库的领域。

3.3 Swift:: 前缀:访问标准库内部

另一个实用场景:Swift:: 前缀可以显式访问 Swift 标准库的内部 API:

// 显式使用 Swift 标准库的 Task,而不是某个第三方库的 Task
let task = Swift::Task {
    await someAsyncOperation()
}

这个设计很关键——它确保了即使项目中有人用 import SomeFramework 引入了另一个也包含 Task 类型的库,你的代码依然能准确引用 Swift 原生的 Task

3.4 模块选择器 vs typealias:何时用哪个

场景推荐方案原因
只用其中一个模块的同名 APIModuleA::getValue()意图明确,无需额外声明
两个模块的同名 API 都要频繁使用typealias代码更简洁
想给冲突的 API 起更语义化的名字typealias选择器不解决命名问题

模块选择器的核心价值是消除歧义,而不是「起别名」。这是两个不同层次的需求。


四、weak let:并发安全场景下的弱引用解锁

4.1 weak var 的历史包袱

Swift 的 weak 引用从语言诞生起就存在,用来打破循环引用。但有一个长期限制:只能修饰 var,不能修饰 let**。

为什么?因为 weak var 本质上是可变的(你随时可以把弱引用设为 nil),而 let 是不可变的。Swift 的并发安全要求中有一条:不可变引用天然线程安全let 可以安全地跨线程传递而不需要 Sendable 检查。

但这里就产生了一个矛盾:我想在并发场景下用 let 声明一个不可变引用,同时又想让它是弱引用(不阻止对象被释放)。Swift 6.3 之前,这做不到。

4.2 weak let 的语法和语义

Swift 6.3 终于放开了这个限制:

class Cache {
    weak let delegate: CacheDelegate?
    //                      ↑
    //               现在可以了!
}

但要理解 weak let 的行为,需要比 weak var 更谨慎一些:

class Observer {
    weak let target: AnyObject?  // 不能是 nil,也不需要是 var

    func notify() {
        guard let t = target else { return }
        t.handleEvent()
    }
}

关键区别在于:weak let 仍然是可选的(AnyObject?),也就是说在读取时仍然是 Optional。但一旦被赋值,就不可重新赋值——这符合 let 的语义。

4.3 为什么这在异步场景下特别重要

考虑一个典型的异步闭包中的弱引用场景:

class DataLoader {
    weak let delegate: DataLoaderDelegate?
    
    func load() async {
        let data = await fetchData()
        
        // 旧写法(weak var):
        guard let delegate = delegate else { return }
        delegate.didLoad(data: data)
        
        // 新写法(weak let)——语义更清晰
        // 不需要在闭包里临时创建可变副本
    }
}

@MainActor 隔离的上下文中,weak let 的优势更明显。因为 @MainActor 要求所有访问都在主线程,而你声明的弱引用本身是不可变的,这样编译器对你的 weak letSendable 分析会更简单直接。


五、编译器优化控制:细粒度性能调优

5.1 为什么库作者需要控制编译器行为?

Swift 标准库和大型框架的作者面临一个微妙的问题:他们写的 API 被别人调用,但性能关键的实现细节他们无法控制。编译器默认的优化策略对大多数场景是好的,但某些对性能极其敏感的 API(比如 JSON 解析器、加密库、压缩库)需要库作者能够「强制」某些优化行为。

Swift 6.3 引入了三个新的编译器控制属性来解决这个问题:

5.2 @specialize:泛型特化

// 库作者的定义
@specialize(Int)
@specialize(String)
@specialize([Int])
public func processGeneric<T>(_ value: T) -> T {
    // 通用实现
}

// 编译器自动生成针对 Int、String、[Int] 的专用版本
// 调用时走特化路径,跳过动态派发

@specialize 解决的问题是:泛型代码在运行时通过动态派发查找具体类型,而特化后,编译器为常用类型生成专用代码,性能提升来自于消除派发开销

5.3 @inline(always):强制内联

public func criticalPath() -> Result {
    @inline(always)
    func stepOne() -> Intermediate { ... }
    
    func stepTwo() -> Intermediate { ... }
    
    let a = stepOne()  // 强制内联,零函数调用开销
    return stepTwo()
}

@inline(always) 确保函数在所有直接调用点都被展开(即使在 release 模式之外),代价是代码体积会增大。这个属性只应用于调用极频繁、体积又极小的函数,比如计数器、自增检查等。

5.4 @export(implementation):暴露 ABI 内部实现

这是一个高级特性。Swift 的库是 ABI 稳定的,意味着库的实现可以更新而不破坏使用者。但有时候,库作者希望某个函数的内部实现能够被编译器看到(用于跨模块优化),同时不改变对外的 ABI:

@export(implementation)
internal func _internalComputeHotPath() -> Int {
    // 这个函数虽然标记为 internal,但它的实现对调用方编译器可见
    // 编译器可以在编译调用方时看到这个函数的实现,从而做跨模块优化
    // 但库的使用者仍然只看到稳定的对外 API
}

这个机制对于高性能数值计算库(比如数学库、ML 推理库)特别有价值。


六、Swift Build:跨平台构建系统的统一之战

6.1 现状:碎片化的构建体验

当前 Swift 生态的构建工具链实际上有三套:

  • Apple 平台:Xcode(基于 LLVM)
  • Linux/macOS:Swift Package Manager + swift build(基于 llbuild)
  • 跨平台 CMake 项目:CMakeLists.txt + Ninja

这导致的问题是:同一个 Swift 项目,想在 Linux 上用 SPM 构建和用 Xcode 构建,体验和产物可能不一样。调试 CI 问题尤其痛苦。

6.2 Swift Build 是什么

Swift 6.3 带来了 Swift Build 的首个预览版本——一个将 Swift Package Manager 与统一构建引擎深度集成的产物。目标是:在所有平台上使用同一套构建系统,不再有 Xcode vs swift build 的分裂。

# Swift 6.3 起,你可以这样使用:
swift build --swift-build  # 启用新的统一构建引擎

# 或者通过 Package.swift 配置:
// swift-tools-version: 6.3
import PackageDescription

package(
    name: "MyApp",
    buildSettings: [
        .enableSwiftBuildPreview(true)  // 启用统一构建预览
    ]
)

6.3 对工程师意味着什么

如果你只做 Apple 平台开发,这个变化感知不强。但对于:

  • 跨平台库作者:只需要维护一套构建配置,在 macOS/Linux/Windows 上行为一致
  • DevOps / CI 工程师:不再需要为不同平台准备不同的构建脚本
  • Swift 开源社区:包的发布者可以更自信地说「我的包在所有平台都能构建」

这实际上是 Swift 走向「真正意义的跨平台语言」的基础设施铺垫。


七、Swift Testing:更现代的测试框架增强

7.1 Issue.record 告警级别

测试不再只是「通过 / 失败」二元论。Swift 6.3 的 Issue.record 支持 severity 参数:

@Test
func testDeprecatedAPI() {
    // 记录一个警告,而不是失败
    Issue.record("此 API 已废弃,请在下一版本迁移", severity: .warning)
    // 测试继续执行
}

@Test
func testFatalCondition() {
    // 明确的失败
    Issue.record("配置缺失,测试无法继续", severity: .default)
    // 标记为失败
}

这个设计非常合理:在大型代码库里,测试套件有时会遇到「可疑但不确定」的情况——比如某些边界条件、已知的 race condition、或者临时的 workaround。用 warning 级别记录,CI 可以运行成功,但 CI 报告里会有明确的告警标记。

7.2 Test.cancel:测试取消机制

参数化测试场景下,单个测试参数失败后想跳过剩余参数?以前得用 continue 或者复杂的状态管理,现在有了 Test.cancel()

@Test(arguments: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
func testExpensiveOperation(_ value: Int) throws {
    if value > 5 && networkQuotaExceeded() {
        try Test.cancel()  // 取消剩余参数,不再继续执行
    }
    try performNetworkCall(for: value)
}

这个设计解决了昂贵的测试参数网格问题——当早期参数已经暴露了足以停止整个测试的问题时,不需要浪费 CI 时间继续执行。

7.3 Image Attachments:测试截图

在 Apple 和 Windows 平台上,Swift Testing 现在支持在测试中附加图像附件:

@Test
func testRenderLayout() async throws {
    let view = MyView()
    let image = await view.renderToImage()
    
    try Test.addAttachment(image, named: "layout_snapshot")
    
    // 断言
    #expect(image.size == expectedSize)
}

这些截图会自动出现在测试报告中。对于 UI 测试、图表渲染测试、可视化组件测试,这个功能可以大幅提升问题定位的效率。


八、DocC 实验性功能:文档生成的工程化升级

8.1 Markdown 输出

Swift 文档工具 DocC 现在支持直接生成 Markdown:

docc convert --enable-experimental-markdown-output

这意味着你可以把 Swift 包的文档直接导出为 Markdown 文件,提交到 GitHub 仓库的 Wiki 或者任意静态文档站点(Docsify、VitePress 等)。之前 DocC 输出的是私有 JSON 格式,虽然信息完整但可读性差,不适合直接展示。

8.2 静态托管优化

--transform-for-static-hosting --experimental-transform-for-static-hosting-with-content 组合参数,会在 index.html 里直接嵌入每页文档的轻量摘要(标题、描述、符号声明、讨论摘要)。这个 HTML snippet 不依赖 JavaScript,对搜索引擎爬虫和屏幕阅读器完全友好。

这解决了一个长期痛点:DocC 生成的文档站点,在禁用了 JavaScript 的环境下一片空白。现在有了服务端嵌入的 HTML 内容,即使没有 JS,页面也能展示基本可读的内容。

8.3 代码块注解

DocC 的实验性代码块注解功能,允许在文档注释里嵌入更丰富的代码结构信息——参数类型、返回值语义、前置条件等。这些元数据可以被外部工具(比如 Swift AI 助手)解析,用于生成更精确的代码补全和文档问答。


九、Embedded Swift 的进化

9.1 统一链接模型

Swift 6.3 在嵌入式领域的最大变化,是嵌入式 Swift 与非嵌入式 Swift 的链接模型趋于统一

之前的分裂感是这样的:你在桌面 Swift 里写的代码,链接到的是 libc 和 libswiftCore 这些标准库;在嵌入式环境里,你需要一套完全不同的链接策略。这导致同一个代码库,要在两个世界工作,需要大量的 #if canImport(Embedded) 预处理。

Swift 6.3 正在弥合这个差距,使得嵌入式代码与非嵌入式代码可以更容易地共享同一个代码路径。

9.2 内存映射 I/O 支持

新增的 Swift MMIO(Memory-Mapped I/O) 支持,让 Swift 可以直接操作硬件寄存器:

// 嵌入式场景:配置 UART 通信
usart1.brr.modify { rw in
    rw.ra  // 读取模式 A
    rw.baudRate = 115200  // 设置波特率
}
// 编译后生成最优的汇编序列,无任何运行时开销

这种硬件级别的操作以前是 C 的专属领域。现在 Swift 可以直接介入固件开发,而且内存安全特性仍然有效——编译器会检测你是否有未定义行为的寄存器访问。

9.3 @section 和 @used 属性

链接控制方面的新属性:

  • @section:显式指定变量或函数放在链接器的特定 section(比如 .rodata.bss
  • @used:确保函数即使未被调用也不被链接器优化掉(对中断向量表等场景必需)

这些能力让 Swift 在嵌入式场景的适用边界又往前推了一步。


十、工程视角:Swift 6.3 对不同角色的影响

10.1 iOS/macOS 开发者

这是受影响最小的群体,但也有值得关注的点:

  • 模块选择器在你依赖大量第三方库时有用武之地
  • Swift Testing 的增强值得迁移——Test.cancel() 和告警级别对复杂测试套件很有价值
  • DocC 的 Markdown 输出让你的开源包文档更易维护

10.2 Android 开发者

这是受影响最大的新群体。如果你的 Android 项目有大量 JNI 代码,或者你需要维护一个跨平台(iOS/Android)的原生库,Swift 6.3 的 Android SDK 直接给了你一个新选项。

建议路径:

  1. 从「用 Swift 写一个新的轻量模块」开始,积累经验
  2. 评估现有 JNI bridge 代码是否可以逐步迁移到 Swift + Swift/Java JNI Core
  3. 关注 Swift 6.3 Android SDK 的稳定性——preview 版本到 stable 通常需要 1-2 个小版本迭代

10.3 后端 / 服务端开发者

Swift 在 Linux 服务端已经有一些生产使用(IBM Kitura、 Vapor 等框架),Swift 6.3 的统一构建系统和 SPM 改进,对这个群体是直接利好。更稳定的跨平台构建,意味着你的 Docker 镜像和 macOS 本地开发环境更可能行为一致。

10.4 嵌入式 / 物联网开发者

嵌入式 Swift 仍然是小众赛道,但 Swift 6.3 的 MMIO 支持、统一链接模型和链接控制属性,让这个赛道的可行性显著提升。如果你团队有 Swift 开发者但没有 C 专家,嵌入式 Swift 是一个值得评估的方向。


十一、Swift 6.3 的局限与悬念

客观地说,Swift 6.3 不是完美的:

  1. Android SDK 仍是预览性质。Swift 6.3 稳定的是 Android SDK 的构建工具链,但大规模生产使用还需要等待。Google 的 Android 团队是否会官方推荐 Swift,目前没有明确信号。

  2. Windows 平台的支持仍然偏弱。Swift on Windows 一直在推进,但生态丰富度远不如 Linux。Swift 6.3 成立了 Windows Workgroup 是一个积极信号,但距离「Windows 开发者也用 Swift」还有距离。

  3. Swift Build 统一构建系统是预览版。正式版需要经过大量社区测试。建议在非关键项目上试用,而不是立刻用于生产 CI。

  4. 与 Kotlin Multiplatform 的竞争关系。Swift 6.3 的 Android 支持,不可避免地与 JetBrains 的 Kotlin Multiplatform(KMP)产生直接竞争。两者各有优势,短期内不会互相替代,但会加速双方的技术迭代。


结语:Swift 的「大一统」还有多远

回顾 Swift 这十年的演进,从「更好的 Objective-C」到「全平台语言」,它的轨迹其实非常清晰:不断突破自己的生态边界,同时不放弃最初的设计哲学——安全、快速、表达力强

Swift 6.3 的意义不只是某个新特性,而是一个信号:Swift 团队在认真推进「一个语言覆盖所有平台」的愿景。Android SDK 的官方支持,加上 C 互操作的全面升级,意味着 Swift 第一次真正意义上具备了「服务端写一套、iOS 端用一套、Android 端也用同一套」的可能性。

当然,工程现实是复杂的——Kotlin/Java 在 Android 的生态壁垒很深,Swift 要真正打入 Android 开发者的工作流,需要的不只是 SDK,还需要 IDE 工具链(Android Studio 插件)、库生态、以及招聘市场的认可。这不是 Swift 6.3 一个版本能解决的问题。

但作为程序员,保持对这类技术趋势的敏感度是必要的。当你下一次评估跨平台技术方案时,Swift 6.3 值得进入你的选项清单。

它可能还不是你项目里最好的选择,但它正在成为一个越来越难以忽视的选择。


参考来源:

  • Swift 6.3 官方发布博客:https://swift.org/blog/swift-6.3-released/
  • Swift 官方文档:https://www.swift.org/
  • InfoQ 深度解读:https://www.infoq.com/news/2026/04/swift-6-3-android-c-interop/

本文约 9500 字,涵盖 Swift 6.3 的 9 大核心特性深度解析。如有疏漏,欢迎指正。

推荐文章

Golang 随机公平库 satmihir/fair
2024-11-19 03:28:37 +0800 CST
支付页面html收银台
2025-03-06 14:59:20 +0800 CST
微信小程序热更新
2024-11-18 15:08:49 +0800 CST
Vue3 结合 Driver.js 实现新手指引
2024-11-18 19:30:14 +0800 CST
Nginx 跨域处理配置
2024-11-18 16:51:51 +0800 CST
用 Rust 构建一个 WebSocket 服务器
2024-11-19 10:08:22 +0800 CST
25个实用的JavaScript单行代码片段
2024-11-18 04:59:49 +0800 CST
JavaScript中的常用浏览器API
2024-11-18 23:23:16 +0800 CST
pycm:一个强大的混淆矩阵库
2024-11-18 16:17:54 +0800 CST
php内置函数除法取整和取余数
2024-11-19 10:11:51 +0800 CST
Vue3中哪些API被废弃了?
2024-11-17 04:17:22 +0800 CST
Go语言中的mysql数据库操作指南
2024-11-19 03:00:22 +0800 CST
Vue 3 中的 Watch 实现及最佳实践
2024-11-18 22:18:40 +0800 CST
Go 协程上下文切换的代价
2024-11-19 09:32:28 +0800 CST
PostgreSQL日常运维命令总结分享
2024-11-18 06:58:22 +0800 CST
gin整合go-assets进行打包模版文件
2024-11-18 09:48:51 +0800 CST
Redis函数在PHP中的使用方法
2024-11-19 04:42:21 +0800 CST
Web 端 Office 文件预览工具库
2024-11-18 22:19:16 +0800 CST
如何配置获取微信支付参数
2024-11-19 08:10:41 +0800 CST
html一个包含iPhoneX和MacBook模拟器
2024-11-19 08:03:47 +0800 CST
php curl并发代码
2024-11-18 01:45:03 +0800 CST
程序员茄子在线接单