当前位置: 首页 > news >正文

【高频考点精讲】JavaScript中的访问者模式:从AST解析到数据转换的艺术

大家好呀!今天想和大家聊聊一个既实用又有点"高冷"的设计模式——访问者模式。这个模式在AST解析、Babel插件开发中无处不在,但很多同学可能一直没搞明白它到底妙在哪里。

一、生活中的访问者模式

想象一下你开了一家奶茶店,店里来了几位顾客:

  • 程序员小王:只看配料表里的咖啡因含量
  • 健身达人小李:只关心热量和糖分
  • 环保人士小张:只检查杯子是不是可降解材料

每个顾客都只"访问"他们关心的部分,这就是访问者模式的精髓——将操作与对象结构分离

二、什么是访问者模式?

官方定义太拗口,我用人话解释:访问者模式允许你在不修改对象结构的情况下,定义新的操作。

举个代码例子,假设我们有一个简单的DOM树:

class Element {constructor(name, children = []) {this.name = namethis.children = children}// 关键方法:接受访问者accept(visitor) {visitor.visit(this)this.children.forEach(child => child.accept(visitor))}
}class TextNode {constructor(content) {this.content = content}accept(visitor) {visitor.visit(this)}
}

现在我们可以创建不同的访问者来做不同的事情:

// 创建一个打印访问者
class Printer {visit(node) {if (node instanceof Element) {console.log(`元素节点: ${node.name}`)} else {console.log(`文本节点: ${node.content}`)}}
}// 使用示例
const domTree = new Element('div', [new Element('p', [new TextNode('Hello')]),new TextNode('World')
])domTree.accept(new Printer())
// 输出:
// 元素节点: div
// 元素节点: p
// 文本节点: Hello
// 文本节点: World

三、为什么需要访问者模式?

1. 场景分析

假设我们要实现一个Babel插件,需要对AST进行多种操作:

  • 代码压缩(删除注释、缩短变量名)
  • 代码转换(ES6转ES5)
  • 代码分析(计算复杂度)

没有访问者模式时,我们可能这样写:

function traverse(ast) {// 处理变量声明if (ast.type === 'VariableDeclaration') {// 压缩逻辑// 转换逻辑// 分析逻辑}// 处理函数声明...
}

所有逻辑耦合在一起,像一锅大杂烩!

2. 访问者模式的优势

使用访问者模式后:

// 压缩访问者
class Minifier {VariableDeclaration(node) {// 只关心压缩逻辑}
}// 转换访问者
class Transformer {VariableDeclaration(node) {// 只关心转换逻辑}
}// 分别应用
ast.visit(new Minifier())
ast.visit(new Transformer())

就像把瑞士军刀的不同工具拆分开,每个工具专注一件事。

四、实战:实现一个简易Babel插件

让我们用访问者模式实现一个真实案例:把所有console.log替换为alert。

1. 定义AST节点类型

const ast = {type: 'Program',body: [{type: 'ExpressionStatement',expression: {type: 'CallExpression',callee: {type: 'MemberExpression',object: { type: 'Identifier', name: 'console' },property: { type: 'Identifier', name: 'log' }},arguments: [{ type: 'Literal', value: 'Hello' }]}}]
}

2. 创建转换访问者

class ConsoleToAlertVisitor {// 处理成员表达式(console.log)MemberExpression(node) {if (node.object.name === 'console' && node.property.name === 'log') {node.object.name = ''  // 清空consolenode.property.name = 'alert' // 改为alert}}
}// 简单的遍历函数
function traverse(node, visitor) {if (typeof visitor[node.type] === 'function') {visitor[node.type](node)}// 递归遍历子节点for (const key in node) {if (typeof node[key] === 'object' && node[key] !== null) {traverse(node[key], visitor)}}
}// 应用访问者
traverse(ast, new ConsoleToAlertVisitor())
console.log(JSON.stringify(ast, null, 2))

转换后的AST中,console.log已经被替换成了alert!

五、访问者模式在流行库中的应用

1. Babel中的访问者

Babel的插件系统就是基于访问者模式:

export default function() {return {visitor: {Identifier(path) {// 处理所有标识符},FunctionDeclaration(path) {// 处理函数声明}}}
}

2. ESLint中的访问者

ESLint规则也是类似原理:

module.exports = {create(context) {return {VariableDeclarator(node) {if (node.id.name.length < 3) {context.report(node, '变量名太短啦!')}}}}
}

六、访问者模式的优缺点

👍 优点:

  • 符合开闭原则:新增操作不用修改原有结构
  • 职责分离:每种访问者只关注自己的逻辑
  • 集中管理:相关操作集中在同一个访问者中

👎 缺点:

  • 破坏封装:需要暴露对象内部结构
  • 增加复杂度:简单场景可能过度设计
  • 不适用于频繁变更的结构:每次结构变化都要改所有访问者

七、课后思考题

下面这段代码使用访问者模式实现了一个简单的计算器,但输出结果不符合预期,你能找出问题并修复吗?

class NumberNode {constructor(value) {this.value = value}accept(visitor) {return visitor.visitNumber(this)}
}class AddNode {constructor(left, right) {this.left = leftthis.right = right}accept(visitor) {return visitor.visitAdd(this)}
}class CalculatorVisitor {visitNumber(node) {return node.value}visitAdd(node) {return node.left.accept(this) + node.right.accept(this)}
}// 计算: 1 + 2 + 3
const expr = new AddNode(new NumberNode(1),new AddNode(new NumberNode(2), new NumberNode(3))
)console.log(expr.accept(new CalculatorVisitor())) // 预期输出6,实际输出?

把你的答案写在评论区吧!我会随机抽几位同学的答案进行点评哦~

八、最后总结

访问者模式就像是一个专业团队中的专家顾问:

  • AST是你要审计的公司
  • 每个访问者是不同领域的专家(财务、法律、技术)
  • 专家们轮流审计,各自出具专业报告

这下应该理解了吧!

掌握这个模式后,你再去看Babel插件、ESLint规则,会有种豁然开朗的感觉。下次遇到需要处理复杂对象结构的场景,不妨考虑下访问者模式这个神器!

往期精选

【初级】前端开发工程师面试100题(一)
【初级】前端开发工程师面试100题(二)
【初级】前端开发工程师的面试100题(速记版)

觉得有用的话别忘了【点赞】【收藏】【分享】给朋友,有什么问题在评论区留言,我们下期再见!👋

相关文章:

【高频考点精讲】JavaScript中的访问者模式:从AST解析到数据转换的艺术

大家好呀&#xff01;今天想和大家聊聊一个既实用又有点"高冷"的设计模式——访问者模式。这个模式在AST解析、Babel插件开发中无处不在&#xff0c;但很多同学可能一直没搞明白它到底妙在哪里。 一、生活中的访问者模式 想象一下你开了一家奶茶店&#xff0c;店里…...

crictl 拉取镜像报错 Unimplemented desc = unknown service runtime.v1.ImageService

具体报错内容如下 crictl pull registry.cn-beijing.aliyuncs.com/kubesphereio/pause:3.9 FATA[0000] validate service connection: validate CRI v1 image API for endpoint "unix:///run/containerd/containerd.sock": rpc error: code Unimplemented desc un…...

1.第一章:数据治理的历史演进

文章目录 1.1 数据管理的进化之路1.2 数据整合时代的突破与局限1.3 数据治理时代的全面展开1.4 智能数据治理的突破性进展1.5 数据分类的根本价值与方法论1.6 数据分类的新方向 第一章快速的过一下&#xff1a; 相关专栏&#xff1a;数据分类的艺术 1.1 数据管理的进化之路 数…...

ApacheJmeter使用权威指南

1. JMeter 概述 JMeter 是一款开源的性能测试工具&#xff0c;支持HTTP、FTP、JDBC、SOAP等协议&#xff0c;广泛用于负载测试、压力测试和功能测试。 核心功能&#xff1a; 模拟多用户并发请求生成实时测试报告支持分布式测试断言验证响应结果 2. 安装与配置 2.1 环境要求…...

Ethan独立开发产品日报 | 2025-04-22

1. Agent Simulate 用数千个数字人来测试你的人工智能应用。 Agent Simulate 让你在发布之前&#xff0c;能够在一个安全的环境中模拟和测试大型语言模型&#xff08;LLM&#xff09;代理。它帮助你调试行为、加快迭代速度&#xff0c;并降低生产风险&#xff0c;专为代理开发…...

C++二分法详解

C二分法详解 文章目录 C二分法详解一、算法简介二、算法原理三、代码实现四、复杂度分析五、常见练习题 一、算法简介 二分查找&#xff08;Binary Search&#xff09;是一种 高效搜索算法 &#xff0c;适用于 有序序列 。通过每次将搜索范围减半&#xff0c;时间复杂度为O(log…...

【UML建模】数据流图 绘制

管理-相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 (一)知识点 1.1定义 数据流图或数据流程图(Data Flow Diagram,简称DFD),是需求分析阶段(结构化分析 SA)中主要表达工具 , 用于表示软件模型的一种图示方法。它以图形的方式描绘数据在系统中流动和处理…...

django软件开发招聘数据分析与可视化系统设计与实现(源码+lw+部署文档+讲解),源码可白嫖!

摘要 时代在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势&#xff0c;招聘信息管理系统当然不能排除在外。软件开发招聘数据分析与可视化系统是在实际应用和软件工程的开发原理之上&#xff0c;运用Python语言…...

HarmonyOS-ArkUI 一镜到底之组件内隐式共享元素转场 geometryTransition

geometry transition 英译为: 几何过渡。这个动画写法挺简单的,不妨碍人家的炫酷。这种效果其实就是传说中的一镜到底!从现在开始,本文geometry transition 与一镜到底具有同样的含义,指的是同样的概念。 共享元素转场(一镜到底)指的是什么效果(图文对比) 共享元素转场着…...

Visual Studio2022 配置 SDL3及拓展库

SDL&#xff08;Simple DirectMedia Layer&#xff09;是一个开源的跨平台多媒体开发库&#xff0c;使用C语言编写&#xff0c;主要用于游戏、模拟器和媒体播放器等多媒体应用的开发。它提供了控制图像、声音、输入输出等功能的函数&#xff0c;使开发者能够用相同的代码开发跨…...

Apache Flink 深度解析:流处理引擎的核心原理与生产实践指南

Apache Flink 深度解析&#xff1a;流处理引擎的核心原理与生产实践指南 引言&#xff1a;实时计算的范式革命 2023年双十一期间&#xff0c;某头部电商平台基于Flink构建的实时风控系统成功拦截了每秒超过120万次的异常交易请求。这背后是Apache Flink作为第四代计算引擎的强…...

17.QT-Qt窗口-工具栏|状态栏|浮动窗口|设置停靠位置|设置浮动属性|设置移动属性|拉伸系数|添加控件(C++)

⼯具栏 ⼯具栏是应⽤程序中集成各种功能实现快捷键使⽤的⼀个区域。可以有多个&#xff0c;也可以没有&#xff0c;它并不是应⽤程序中必须存在的组件。它是⼀个可移动的组件&#xff0c;它的元素可以是各种窗⼝组件&#xff0c;它的元素通常以图标按钮的⽅式存在。如下图为⼯…...

开源模型应用落地-语音合成-Spark-TTS-零样本克隆与多语言生成的突破

一、前言 在人工智能生成内容(AIGC)浪潮中,文本到语音(TTS)技术始终面临一个核心矛盾:如何在效率与自然度之间找到平衡?传统TTS系统依赖复杂的多阶段流程,从文本分析到声学建模再到音频生成,每一步都可能成为“自然感”的瓶颈。而新兴的Spark-TTS ,凭借其颠覆性的“单…...

锁存器知识点详解

一、锁存器基础概念​ 锁存器&#xff08;Latch&#xff09;是一种基础的数字电路存储元件&#xff0c;能够在时钟信号或使能信号的控制下&#xff0c;暂时保存数据状态。与触发器&#xff08;Flip-Flop&#xff09;不同&#xff0c;锁存器是电平敏感的&#xff0c;即在使能信…...

武装Burp Suite工具:xia SQL自动化测试_插件

武装Burp Suite工具&#xff1a;xia SQL自动化测试_插件 插件作者介绍&#xff1a;本插件仅只插入单引号&#xff0c;没有其他盲注啥的&#xff0c;且返回的结果需要人工介入去判断是否存在注入&#xff0c;如果需要所有注入都测试&#xff0c;请把burp的流量转发到xray。 目录…...

Java面试:探索Spring Boot与微服务的深度挑战

场景&#xff1a;互联网大厂Java求职面试 在一个阳光明媚的上午&#xff0c;赵大宝来到了知名互联网大厂进行Java开发岗位的面试。面试官是一位严肃且经验丰富的技术专家&#xff0c;准备对赵大宝进行技术上的全面考核。 第一轮提问&#xff1a;基础知识与Spring框架 面试官…...

【redis】主从复制

Redis的单机模式仅部署单个实例&#xff0c;一旦节点宕机或网络故障&#xff0c;所有依赖Redis的服务将不可用&#xff0c;这就是所谓的单点故障问题。单节点需承担全部读写请求&#xff0c;并发量高时可能成为性能瓶颈。单节点受限于物理内存容量&#xff0c;无法突破内存物理…...

Qt多线程学习初级指南

一、引言部分 1. 多线程编程的重要性 在当今计算环境中&#xff0c;多线程编程已成为开发高性能应用程序的关键技术。现代应用程序面临着三大挑战&#xff1a; GUI响应性&#xff1a;用户界面需要保持流畅响应&#xff0c;即使在进行后台计算时 多核利用率&#xff1a;随着多…...

《解锁vLLM:大语言模型推理的加速密码》

《解锁vLLM:大语言模型推理的加速密码》 引言:AI 时代的推理引擎之光 在当今的人工智能领域,大语言模型无疑是最为耀眼的明星。它们犹如智能世界的基石,为无数的应用和创新提供了强大的支持。从日常的智能聊天机器人,到复杂的文本生成、机器翻译任务,大语言模型都展现出…...

1.1 java开发的准备工作

准备工作 一.JDK 开始写java程序之前需要安装jdk jdk是java开发工具&#xff0c;包含着JRE和里面的JVM(虚拟机&#xff0c;可以使得不同环境下都能运行Java程序)&#xff0c;和开发工具。 二.了解写程序的三大步骤步骤 java成功运行主要需要经过代码编写&#xff0c;编译&a…...

矩阵运算 第30次CCF-CSP计算机软件能力认证

n和d差距这么大 就可以想到改变矩阵运算顺序来解决这道题 假设两个矩阵&#xff0c;分别为a行b列与b行c列&#xff0c;那么一次矩阵运算复杂度是a乘以c乘以b&#xff0c;对于这题&#xff0c;如果从左往右运算复杂度将会到 1e4乘以1e4乘以20>1e9 (n1e4,d20)&#xff0c;常识…...

【Tools】Git常见操作

Git 1 配置 包括: 用户信息、分支策略、合并策略、钩子脚本路径等。 git config -l # 等价 --local --list git config --global --list # 全局 git config --local --list # 当前仓库git config user.name git config user.emailgit config user.name "Your Name"…...

国产RK3568+FPGA以 ‌“实时控制+高精度采集+灵活扩展”‌ 为核心的解决方案

RK3568FPGA方案在工业领域应用的核心优势 一、‌实时性与低延迟控制‌ ‌AMP架构与GPIO中断技术‌ 通过非对称多处理架构&#xff08;AMP&#xff09;实现Linux与实时操作系统&#xff08;RTOS/裸机&#xff09;协同&#xff0c;主核负责调度&#xff0c;从核通过GPIO中断响应紧…...

UnoCSS原子CSS引擎-前端福音

UnoCSS是一款原子化的即时按需 CSS 引擎&#xff0c;其中没有核心实用程序&#xff0c;所有功能都是通过预设提供的。默认情况下UnoCSS应用通过预设来实现相关功能。 UnoCSS中文文档&#xff1a; https://www.unocss.com.cn 前有很多种原子化的框架&#xff0c;例如 Tailwind…...

0.(新专栏目录)数据分类的艺术:从理论到实践的全面指南

前言 话说天下大数据事&#xff0c;分久必合&#xff0c;合久必分。在这个数据爆炸的时代&#xff0c;我们见证了数据的分散与聚合&#xff0c;见证了数据从孤岛到互联的转变。 回望数据发展的历程&#xff0c;最初企业的数据系统往往是各自为政的&#xff0c;各部门、各系统…...

leetcode 二分查找应用

34. Find First and Last Position of Element in Sorted Array 代码&#xff1a; class Solution { public:vector<int> searchRange(vector<int>& nums, int target) {int low lowwer_bound(nums,target);int high upper_bound(nums,target);if(low high…...

航电系统之编队运动控制技术篇

航电系统的编队运动控制技术是现代航空航天领域的关键技术之一&#xff0c;涉及多飞行器协同飞行中的导航、通信、控制与决策。 一、技术原理 编队运动控制技术的核心目标是通过航电系统实现多飞行器&#xff08;如无人机、卫星等&#xff09;在空间或时间上的协同运动。其基本…...

Elasticsearch(ES)中的脚本(Script)

文章目录 一. 脚本是什么&#xff1f;1. lang&#xff08;脚本语言&#xff09;2. source&#xff08;脚本代码&#xff09;3. params&#xff08;参数&#xff09;4. id&#xff08;存储脚本的标识符&#xff09;5. stored&#xff08;是否为存储脚本&#xff09;6. script 的…...

Collection集合,List集合,set集合,Map集合

文章目录 集合框架认识集合集合体系结构Collection的功能常用功能三种遍历方式三种遍历方式的区别 List集合List的特点、特有功能ArrayList底层原理LinkedList底层原理LinkedList的应用场list:电影信息管理模块案例 Set集合set集合使用哈希值红黑树HashSet底层原理HashSet集合元…...

Kafka 核心使用机制总结

Kafka 核心使用机制总结 Kafka 核心使用机制总结1. 分区 (Partitions) - 实现伸缩性与并行处理2. 副本 (Replicas) / 复制因子 (Replication Factor) - 实现高可用与容错3. 消费者组 (Consumer Groups) - 控制消息分发与消费进度4. 数据保留策略 (Retention Policies) - 管理存…...

【MCP】第二篇:IDE革命——用MCP构建下一代智能工具链

【MCP】第二篇&#xff1a;IDE革命——用MCP构建下一代智能工具链 一、引言二、IDE集成MCP2.1 VSCode2.1.1 安装VSCode2.1.2 安装Cline2.1.3 配置Cline2.1.4 环境准备2.1.5 安装MCP服务器2.1.5.1 自动安装2.1.5.2 手动安装 2.2 Trae CN2.2.1 安装Trae CN2.2.2 Cline使用2.2.3 内…...

WebSocket是h5定义的,双向通信,节省资源,更好的及时通信

浏览器和服务器之间的通信更便利&#xff0c;比http的轮询等效率提高很多&#xff0c; WebSocket并不是权限的协议&#xff0c;而是利用http协议来建立连接 websocket必须由浏览器发起请求&#xff0c;协议是一个标准的http请求&#xff0c;格式如下 GET ws://example.com:3…...

【PostgreSQL教程】PostgreSQL 特别篇之 语言接口连接Perl

博主介绍:✌全网粉丝22W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。 感兴趣的可…...

springboot-基于Web企业短信息发送系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 当今社会已经步入了科学技术进步和经济社会快速发展的新时期&#xff0c;国际信息和学术交流也不断加强&#xff0c;计算机技术对经济社会发展和人民生活改善的影响也日益突出&#xff0c;人类的生存和思考方式也产生了变化。本系统采用B/S架构&#xff0c;数据库是MySQL…...

Centos9安装docker

1. 卸载docker 查看是否安装了docker yum list | grep docker卸载老版本docker&#xff0c;拷贝自官网 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine卸载新版本…...

MySQL表的操作

MySQL表的操作 1. 创建表 在创建表前&#xff0c;需要先进入到某个数据库&#xff1a; use db_name创建表时&#xff0c;最好提前设计好表应该有的所有内容&#xff0c;否则后续添加或删除表的列可能会引发一连串的问题。 create table tb_name (field1 data_type [comment…...

Jmeter中同步定时器使用注意点

1.设置数量不可大于总线程数量&#xff0c;不然会一直等待 2.设置数量必须与总线程数量成整数倍数&#xff0c;不然还是要一直等。 3.当配置的数量小于线程数时&#xff0c;最好把循环打开&#xff0c;避免最后一次未准备好的线程数量达不到并发数。...

从零开始搭建Django博客③--前端界面实现

本文主要在Ubuntu环境上搭建&#xff0c;为便于研究理解&#xff0c;采用SSH连接在虚拟机里的ubuntu-24.04.2-desktop系统搭建&#xff0c;当涉及一些文件操作部分便于通过桌面化进行理解&#xff0c;通过Nginx代理绑定域名&#xff0c;对外发布。 此为从零开始搭建Django博客…...

使用Handsontable实现动态表格和下载表格

1.效果 2.实现代码 首先要加载Handsontable&#xff0c;在示例中我是cdn的方式引入的&#xff0c;vue的话需要下载插件 let hot null;var exportPlugin null;function showHandsontable(param) {const container document.getElementById("hot-container");// 如果…...

结合地理数据处理

CSV 文件不仅可以存储表格数据&#xff0c;还可以与地理空间数据结合&#xff0c;实现更强大的地理处理功能。例如&#xff0c;你可以将 CSV 文件中的坐标数据转换为点要素类&#xff0c;然后进行空间分析。 示例&#xff1a;将 CSV 文件中的坐标数据转换为点要素类 假设我们有…...

使用Geotools实现将Shp矢量文件加载SLD并合并图例生成-以湖南省周边城市为例

目录 前言 一、技术实现简介 1、生成成果说明 2、生成流程图说明 二、具体生成实践 1、渲染地图 2、生成图例 3、合并图像及输出 三、总结 前言 在当今数字化时代&#xff0c;地理信息系统&#xff08;GIS&#xff09;技术已成为城市管理、资源规划、环境监测等众多领域…...

openGauss数据库:起源、特性与对比分析

openGauss数据库&#xff1a;起源、特性与对比分析 一、起源与发展历程 1. 技术背景与开源历程 openGauss是由华为公司主导开发的开源关系型数据库管理系统&#xff0c;其技术根源可追溯至PostgreSQL。2019年&#xff0c;华为在内部整合了多个数据库产品线&#xff08;如GMDB…...

相机中各个坐标系的转换关系如像素坐标系到世界坐标系以及相机标定的目的

一、背景 无论是机器人领域、SLAM还是自动驾驶领域&#xff0c;都会涉及相机标定&#xff0c;但是看了很多博客&#xff0c;都是各种坐标系的变换&#xff0c;没有从上层说明进行坐标变换的目的是什么&#xff0c;以及相机标定完成后&#xff0c;是已知像素坐标求世界坐标&…...

ubuntu24设置拼音输入法,解决chrome不能输入中文

## 推荐方案&#xff1a;使用 Fcitx5 Fcitx5 是当前在 Wayland 环境下兼容性最好的输入法框架。 ### 1. 安装 Fcitx5 bash sudo apt update sudo apt install fcitx5 fcitx5-chinese-addons fcitx5-frontend-gtk3 fcitx5-frontend-gtk4 fcitx5-frontend-qt5 fcitx5-module-c…...

linux内核进程管理(1)——创建,退出

linux源码阅读——进程管理&#xff08;1&#xff09; 1. 进程的基本介绍1.1 linux中进程和线程的区别1.2 task_struct中的基本内容1.3 命名空间ns(namespace)命名空间结构图Linux 中的命名空间类型 1.4 进程标识符 2. 创建一个进程的流程2.1 CLONE宏2.2 创建进程系统调用1. do…...

容器修仙传 我的灵根是Pod 第8章 护山大阵(DaemonSet)

第三卷&#xff1a;上古遗迹元婴篇 第8章 护山大阵&#xff08;DaemonSet&#xff09; 九霄之上&#xff0c;雷云如怒海翻腾。 天调度宗的护山大阵「九霄雷光阵」正发出悲鸣&#xff0c;七十二根镇山雷柱已有半数熄灭。每根雷柱底部&#xff0c;本该守护节点的「雷符傀儡」&a…...

使用Python将YOLO的XML标注文件转换为TXT文件格式

使用Python将YOLO的XML标注文件转换为TXT文件格式&#xff0c;并划分数据集 import xml.etree.ElementTree as ET import os from os import listdir, getcwd from os.path import join import random from shutil import copyfile from PIL import Image# 只要改下面的CLASSE…...

在面试中被问到spring是什么?

Spring框架的核心回答 1. 定义与定位 Spring是一个轻量级、开源的企业级应用开发框架&#xff0c;旨在简化Java应用的开发&#xff0c;提供全面的编程和配置模型。它的核心目标是解决企业应用开发的复杂性&#xff0c;通过模块化设计和松耦合架构&#xff0c;帮助开发者更高效…...

MongoDB Ubuntu 安装

MongoDB 安装 https://www.mongodb.com/zh-cn/docs/manual/installation/ https://www.mongodb.com/zh-cn/docs/manual/tutorial/install-mongodb-on-ubuntu/ https://www.mongodb.com/zh-cn/docs/manual/reference/ulimit/ https://www.mongodbmanager.com/download ubun…...

ElasticSearch深入解析(三):Elasticsearch 7的安装与配置、Kibana安装

文章目录 〇、简介1.Elasticsearch简介2.典型业务场景3.数据采集工具4.名词解释 一、安装1.使用docker(1)创建虚拟网络(2)Elasticsearch安装步骤 2.使用压缩包 二、配置1.目录介绍2.配置文件介绍3.elasticsearch.yml节点配置4.jvm.options堆配置问题&#xff1a;为什么说堆内存…...