Alluxio Go 客户端开发指南:通过 REST API 代理访问 Alluxio 文件系统
存储分布式文件系统缓存大数据【免费下载链接】alluxioAlluxio, data orchestration for analytics and machine learning in the cloud项目地址https://gitcode.com/gh_mirrors/al/alluxio点击查看免费下载本指南基于 Alluxio 官方文档docs/cn/api/Clients-Go.md系统讲解如何在 Go 语言项目中通过 Alluxio 代理Proxy提供的 REST API 访问 Alluxio 文件系统包括代理的启动与停止、Go 客户端库的安装、完整的文件写入/读取示例以及 REST API 在仓库源码中的底层实现。读完本文你将能够独立编写一个可运行的 Go 程序完成对 Alluxio 中文件的创建、写入、读取、删除与存在性检查等操作。一、Go 客户端概览面向非 JVM 生态的 Alluxio 接入方式Alluxio 是一个面向分析与机器学习的云原生数据编排系统其核心访问方式通常是 Java 原生文件系统客户端。但对于 Go 等非 JVM 语言生态Alluxio 官方提供了独立的 Go 语言客户端仓库中的相关文档见 docs/cn/api/Clients-Go.md其特点是基于 REST API 通信Go 客户端本身不直接与 Alluxio master/worker 进行 RPC而是通过 Alluxio REST API 代理与 Alluxio 交互API 形态贴近 Java 客户端它提供与原生文件系统 Java 客户端相似的 API 设计覆盖文件上传、下载、存在性检查、状态列举等常见操作降低熟悉 Alluxio Java API 的开发者迁移到 Go 的成本接口信息可查客户端所有可用接口的详细信息包括如何下载、上传 Alluxio 中的文件检查文件是否存在列出文件状态等可通过客户端项目的 godoc 文档查询。这一架构的意义在于Go 程序只需依赖一个 HTTP 代理即可获得与 Java 客户端近乎一致的文件系统语义而无需在 Go 侧维护复杂的 RPC 协议栈。二、工作原理Go 客户端 → Alluxio 代理 REST API → Alluxio 文件系统Go 客户端与 Alluxio 的交互链路可以概括为一条清晰的 HTTP 调用链Go 程序 (alluxio-go Client) │ HTTP / REST (默认端口 39999) ▼ Alluxio 代理 (Proxy 进程独立 server) │ 调用 Alluxio FileSystem Java API ▼ Alluxio 集群master / worker从仓库源码可以确认这条链路的存在。代理进程的 REST 服务由三个 Handler 组成均位于 core/server/proxy/src/main/java/alluxio/proxy 目录下PathsRestServiceHandler.java负责元数据类操作路径前缀为paths内部持有alluxio.client.file.FileSystem对象Api(value /paths, description RESTful gateway for Alluxio Filesystem Client (Metadata))提供create-directory、create-file、delete、exists、free、get-status、list-status、mount、open-file、rename、set-attribute、unmount、download-file等端点StreamsRestServiceHandler.java负责数据流操作路径前缀为streams通过StreamCache管理已创建的读写流Api(value /streams, description RESTful gateway for Alluxio Filesystem Client (Data))提供close、read、write三个端点AlluxioProxyRestServiceHandler.java提供proxy/info端点返回代理进程的启动时间、运行时长与版本信息。其中最关键的设计是REST API 与 Java API 在流Stream表示上的差异。Java API 可以在内存中直接持有流对象而 REST API 将流的创建与流的访问分离docs/cn/api/Clients-Rest.mdcreate-file/open-file返回一个整数形式的流 ID该 ID 被存入代理进程内的StreamCache后续的读/写操作通过streams/{id}/read、streams/{id}/write、streams/{id}/close端点携带流 ID 完成。在 StreamsRestServiceHandler.java 中可以看到close端点的实现当流被从StreamCache失效时缓存的移除监听器会自动关闭底层流若 ID 无效则抛出IllegalArgumentException(stream does not exist)。Go 客户端正是按这套语义组织读写流程的。三、前置条件启动 Alluxio 代理Go 客户端无法绕过代理直接访问 Alluxio因此运行 Go 程序前必须先确保 Alluxio 代理处于运行状态。3.1 启动与停止命令代理是一个独立运行的 server通过 Alluxio 的启停脚本管理脚本位于仓库 bin/alluxio-start.sh 与 bin/alluxio-stop.sh# 启动代理 ${ALLUXIO_HOME}/bin/alluxio-start.sh proxy # 停止代理 ${ALLUXIO_HOME}/bin/alluxio-stop.sh proxy其中${ALLUXIO_HOME}是 Alluxio 的安装目录。从 bin/alluxio-start.sh 的源码可以看到start_proxy()会通过launch-process proxy启动代理进程并将日志写入${ALLUXIO_LOGS_DIR}/proxy.out同时它还支持alluxio-start.sh -a proxy的形式在所有节点masters/workers上批量启动代理。3.2 默认端口 39999 与配置项默认情况下REST API 监听39999 端口。这一默认值在仓库源码中有明确定义core/common/src/main/java/alluxio/conf/PropertyKey.java 中alluxio.proxy.web.portPROXY_WEB_PORT的默认值为39999描述为 The port Alluxio proxys web UI runs on.。如需修改端口可通过配置属性alluxio.proxy.web.port调整代理主机名由alluxio.proxy.web.hostname配置。3.3 性能注意事项使用 HTTP 代理会影响性能——尤其是在使用代理时请求会增加一个额外的跳hop计数数据路径比直接访问 worker 更长。官方建议docs/cn/api/Clients-Go.md 与 docs/cn/api/Clients-Rest.md 均明确说明推荐让代理服务和一个 Alluxio worker 运行在同一个计算节点上以降低跨节点跳转带来的开销。因此在规划 Go 客户端部署时应将代理进程与 worker 共置co-locate而不是集中部署在独立机器上。四、安装 Go 语言客户端库Go 客户端库的安装非常简单一条命令即可完成拉取$ go get -d github.com/Alluxio/alluxio-go-d参数表示仅下载依赖包而不立即安装为可执行程序该库是一个库而非可执行文件。拉取完成后你可以在 Go 代码中通过以下 import 路径使用它import ( alluxio github.com/alluxio/alluxio-go github.com/alluxio/alluxio-go/option )其中option包提供了各操作的选项结构体例如option.CreateFile{}、option.OpenFile{}、option.Exists{}、option.Delete{}对应 Java 客户端中按操作传入的 options 参数设计参见 原生文件系统 Java 客户端 中对 options 的说明。五、示例使用程序完整的文件写入与读取下面是一个完整的 Go 示例程序源自 docs/cn/api/Clients-Go.md它演示了 Go 客户端访问 Alluxio 的完整流程检查路径是否存在 → 清理旧文件 → 创建并写入文件 → 重新打开并读取内容。注意如果本地没有 Alluxio 代理在运行请将下面代码中的localhost替换为代理实际所在的主机名。package main import ( fmt io/ioutil log strings time alluxio github.com/alluxio/alluxio-go github.com/alluxio/alluxio-go/option ) // write 在指定路径创建文件并将字符串 s 写入其中 func write(fs *alluxio.Client, path, s string) error { id, err : fs.CreateFile(path, option.CreateFile{}) if err ! nil { return err } defer fs.Close(id) _, err fs.Write(id, strings.NewReader(s)) return err } // read 打开指定路径的文件读取全部内容并返回 func read(fs *alluxio.Client, path string) (string, error) { id, err : fs.OpenFile(path, option.OpenFile{}) if err ! nil { return , err } defer fs.Close(id) r, err : fs.Read(id) if err ! nil { return , err } defer r.Close() content, err : ioutil.ReadAll(r) if err ! nil { return , err } return string(content), err } func main() { fs : alluxio.NewClient(localhost, 39999, 10*time.Second) path : /test_path exists, err : fs.Exists(path, option.Exists{}) if err ! nil { log.Fatal(err) } if exists { if err : fs.Delete(path, option.Delete{}); err ! nil { log.Fatal(err) } } if err : write(fs, path, Success); err ! nil { log.Fatal(err) } content, err : read(fs, path) if err ! nil { log.Fatal(err) } fmt.Printf(Result: %v\n, content) }5.1 关键调用逐段解析1创建客户端连接fs : alluxio.NewClient(localhost, 39999, 10*time.Second)NewClient接收三个参数代理主机名、代理 REST 端口默认 39999、连接超时时间此处为 10 秒。这正是 第三节 中代理进程的监听地址。2检查文件是否存在exists, err : fs.Exists(path, option.Exists{})对应代理 REST 端点paths/{path}/exists。从 PathsRestServiceHandler.java 的实现看该端点最终调用FileSystem#exists(new AlluxioURI(path))并返回布尔值。3删除旧文件if err : fs.Delete(path, option.Delete{}); err ! nil { log.Fatal(err) }对应paths/{path}/delete端点最终调用FileSystem#delete源码见 PathsRestServiceHandler.java。示例中先删除再创建是为了保证在路径已存在时程序可重复运行。4创建文件并写入write函数演示了创建流 → 写数据 → 关闭流的三步流程id, err : fs.CreateFile(path, option.CreateFile{}) // 创建文件返回流 ID defer fs.Close(id) // 关闭流 _, err fs.Write(id, strings.NewReader(s)) // 向流写入数据这与代理端的设计一一对应create-file端点创建FileOutStream并返回流 IDmStreamCache.put(os)见 PathsRestServiceHandler.javastreams/{id}/write端点通过StreamCache取回输出流并ByteStreams.copy(is, os)完成写入见 StreamsRestServiceHandler.javastreams/{id}/close端点使流从缓存失效并自动关闭见 StreamsRestServiceHandler.java。5打开文件并读取read函数演示打开流 → 读数据 → 关闭流的对应流程id, err : fs.OpenFile(path, option.OpenFile{}) // 打开文件返回流 ID r, err : fs.Read(id) // 读取流内容 content, err : ioutil.ReadAll(r) // 将流内容全部读出open-file端点创建FileInStream并缓存返回流 ID见 PathsRestServiceHandler.javastreams/{id}/read端点返回与该 ID 关联的输入流响应以APPLICATION_OCTET_STREAM媒体类型返回见 StreamsRestServiceHandler.java。5.2 预期运行结果若一切正常程序输出Result: Success该输出证明/test_path文件在 Alluxio 中完成了一次完整的创建 → 写入 → 读取生命周期且读回的内容与写入的字符串一致。六、深入理解代理 REST API 的端点全景为了更充分地在 Go 或其他语言中使用代理下表整理了 PathsRestServiceHandler.java 与 StreamsRestServiceHandler.java 中定义的 REST 端点路径前缀均为paths/{path}或streams/{id}端点HTTP 方法说明对应 Java APIpaths/{path}/create-directoryPOST创建目录FileSystem#createDirectorypaths/{path}/create-filePOST创建文件返回流 ID供 streams API 使用FileSystem#createFilepaths/{path}/deletePOST删除路径FileSystem#deletepaths/{path}/download-fileGET下载文件内容APPLICATION_OCTET_STREAMFileSystem#openFilepaths/{path}/existsPOST检查路径是否存在FileSystem#existspaths/{path}/freePOST释放路径从 Alluxio 空间释放FileSystem#freepaths/{path}/get-statusPOST获取路径状态FileSystem#getStatuspaths/{path}/list-statusPOST列出子路径状态列表FileSystem#listStatuspaths/{path}/mountPOST将 UFS 源挂载到 Alluxio 路径需src查询参数FileSystem#mountpaths/{path}/open-filePOST打开文件用于读取返回流 IDFileSystem#openFilepaths/{path}/renamePOST重命名路径需dst查询参数FileSystem#renamepaths/{path}/set-attributePOST更新路径属性FileSystem#setAttributepaths/{path}/unmountPOST卸载挂载点FileSystem#unmountstreams/{id}/closePOST关闭流StreamCache#invalidatestreams/{id}/readPOST读取流内容StreamCache#getInStreamstreams/{id}/writePOST写入流请求体为八位字节流StreamCache#getOutStream从源码还可以确认两个实现细节错误语义对不存在的流 ID 调用read/write/close代理会返回IllegalArgumentException(stream does not exist)Go 客户端会将其包装为对应错误返回可选 options大部分路径操作端点都接受对应的 gRPC options 请求体如CreateFilePOptions、OpenFilePOptions当 options 为空时代理会以默认参数调用 FileSystem 方法——这与 Java 客户端为所有操作指定额外 options 域的设计一致参见 原生文件系统 Java 客户端。代理本身的信息启动时间、运行时长、版本号可通过GET proxy/info端点获取实现在 AlluxioProxyRestServiceHandler.java。七、相关文档与延伸阅读围绕 Go 客户端与代理 REST API仓库中还有以下关联文档与源码可供深入阅读REST API 文档中文讲解 REST API 与 Java API 在流表示上的差异以及代理部署的注意事项原生文件系统 Java 客户端中文Go 客户端 API 形态与之对应可作为理解 Go 客户端语义的参考代理 REST 服务源码PathsRestServiceHandler、StreamsRestServiceHandler、AlluxioProxyRestServiceHandler三个 Handler 的完整实现代理端口配置源码alluxio.proxy.web.port默认值 39999 的定义代理启停脚本start_proxy()的实现与代理日志位置。八、总结Go 客户端通过 Alluxio 代理的 REST API 访问 Alluxio适合非 JVM 语言的接入场景API 形态与 Java 原生文件系统客户端 相似运行前需先启动代理${ALLUXIO_HOME}/bin/alluxio-start.sh proxy默认端口 39999可通过alluxio.proxy.web.port配置调整安装依赖只需go get -d github.com/Alluxio/alluxio-go文件读写遵循创建/打开流 → 通过流 ID 读写 → 关闭流的模型与代理端paths/streams两类 REST 端点严格对应出于性能考虑应尽量让代理与 Alluxio worker 同节点部署以减少 HTTP 代理带来的额外跳数。赞分享存储分布式文件系统缓存大数据【免费下载链接】alluxioAlluxio, data orchestration for analytics and machine learning in the cloud项目地址https://gitcode.com/gh_mirrors/al/alluxio点击查看免费下载相关推荐Alluxio Python客户端使用指南Alluxio Python客户端使用指南 概述 Alluxio作为一个开源的虚拟分布式文件系统提供了多种语言的客户端接口。本文将重点介绍Alluxio Py存储分布式文件系统缓存大数据Headlamp 前端 Kubernetes API 类型解析NetworkPolicyIngressRule 接口实战指南Headlamp 前端 Kubernetes API 类型解析NetworkPolicyIngressRule 接口实战指南 导读 NetworkPolicy存储分布式文件系统缓存大数据Alluxio POSIX API详解通过FUSE实现分布式文件系统本地挂载Alluxio POSIX API详解通过FUSE实现分布式文件系统本地挂载 什么是Alluxio POSIX API Alluxio POSIX API是A存储分布式文件系统缓存大数据上一篇Flutter Engine终极指南深入理解跨平台渲染核心技术下一篇GitHub_Trending/do/docker-firefox完全指南3分钟搭建跨平台浏览器环境创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

用队列实现栈(LeetCode 225):双队列模拟 LIFO 的完整设计与复杂度分析

用队列实现栈(LeetCode 225):双队列模拟 LIFO 的完整设计与复杂度分析

教程文档知识库 【免费下载链接】AlgoNote ⛽️「算法通关手册」:从零开始的「算法与数据结构」学习教程,200 道「算法面试热门题目」,1000 道「LeetCode 题目解析」,持续更新中! 项目地址: https://gitcod…

2026/9/30 12:20:43 阅读更多 →
awesome-agentic-ai-zh 渐进式披露重构实战:用可见主线、`<details>` 收合与 reader-UX 门禁重建 Track A(A1–A3)学习路径

awesome-agentic-ai-zh 渐进式披露重构实战:用可见主线、`<details>` 收合与 reader-UX 门禁重建 Track A(A1–A3)学习路径

教程文档AI Agent人工智能大模型 【免费下载链接】awesome-agentic-ai-zh A trilingual (繁中 / English / 简中) learning roadmap for agentic AI: from LLM basics to multi-agent systems, with 240 curated resources and hands-on examples. 中文 AI agent 學習地圖。 项…

2026/9/30 13:42:15 阅读更多 →
Elsa 3 输出转换器(Output Converters)完全指南:在绑定边界同步、显式、可发现地转换 Activity 输出

Elsa 3 输出转换器(Output Converters)完全指南:在绑定边界同步、显式、可发现地转换 Activity 输出

后端工作流自动化流程编排低代码 【免费下载链接】elsa-core The Workflow Engine for .NET 项目地址: https://gitcode.com/gh_mirrors/el/elsa-core 点击查看 免费下载 本篇技术指南聚焦 Elsa Workflow Engine(.NET)的 Output Converters&…

2026/9/30 22:00:44 阅读更多 →

最新新闻

成为全栈·Next.js 网站前台篇·文章阅读辅助:上下篇、面包屑、相关文章与阅读记录

成为全栈·Next.js 网站前台篇·文章阅读辅助:上下篇、面包屑、相关文章与阅读记录

成为全栈Next.js 网站前台篇文章阅读辅助:上下篇、面包屑、相关文章与阅读记录 正文是文章详情页的主任务,面包屑、上下篇、相关文章和阅读记录都只能帮助阅读。任何一个辅助接口失败,都不应该把正文一起拖进错误页。 前言 各位看官&#xf…

2026/10/1 14:32:52 阅读更多 →
Agent Harness 实战:从 1 个 Agent 到 20 个 Agent,AI 编码工程化脚手架怎么搭

Agent Harness 实战:从 1 个 Agent 到 20 个 Agent,AI 编码工程化脚手架怎么搭

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 14:32:52 阅读更多 →
哪些写作习惯容易让论文被判定为AI生成

哪些写作习惯容易让论文被判定为AI生成

论文被判定为AI生成,问题多半出在动笔阶段的习惯里,而不是提交前临时补的动作。这篇内容把容易留下机器痕迹的写作习惯拆成可对照的方向性判据,每条附上可执行的改写动作与对应入口。知学术AIPaperGPT 开放免费智能大纲与免费科研元素生成两项…

2026/10/1 14:32:52 阅读更多 →
长春汽车经济技术开发区环境好的养老院公司推荐——颐禾苑养老康复中心客户真实体验口碑汇总

长春汽车经济技术开发区环境好的养老院公司推荐——颐禾苑养老康复中心客户真实体验口碑汇总

长春汽开区环境好的养老院怎么选?颐禾苑真实客户口碑与实力全解析开篇一句话看清颐禾苑的核心价值在长春汽车经济技术开发区,如果要推荐一家环境好、口碑好、照护专业的养老康复机构,长春汽车经济技术开发区颐禾苑养老康复中心是许多家庭反复提及的名字…

2026/10/1 14:32:52 阅读更多 →
VS Code Vue (Official) 插件详解:从 Volar 到 TaoToken 的完整配置指南

VS Code Vue (Official) 插件详解:从 Volar 到 TaoToken 的完整配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 14:32:52 阅读更多 →
手搓生产级 AI Agent 系统(18):从单MCP到多MCP架构选型与落地关注点

手搓生产级 AI Agent 系统(18):从单MCP到多MCP架构选型与落地关注点

在上一篇中,我们把 Agent Identity 与 Delegated Authority 作为工具调用的治理底座,回答了“谁授权、代表谁、为什么做”。当 Agent 需要接入的外部能力从一两个工具膨胀到多个数据源、多个工具服务时,单 MCP 的接入方式会迅速遇到瓶颈。本篇…

2026/10/1 14:31:51 阅读更多 →

日新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 18:13:06 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →