D3.js(五):实现组织架构图

实现组织架构图

    • 效果
    • 初始化组织机构容器并实现缩放平移功能
      • 效果
      • 源码
    • 渲染节点
      • 效果
      • 源码
    • 渲染连线
      • 效果
      • 源码
    • 完整源码

效果

在这里插入图片描述
在这里插入图片描述

初始化组织机构容器并实现缩放平移功能

效果

在这里插入图片描述

源码

import {useEffect} from 'react';
import TreeData from './json/tree-data.json';interface ITreeConfig {k: number,x: number,y: number,
}interface ITreeData {_id?: number,name: string,children?: ITreeData[] | null,_children?: ITreeData[] | null,
}const d3 = window.d3;const TreeConfig: ITreeConfig = {k: 1,x: 0,y: 0,
};function OrgChart() {const init = (data: ITreeData, config: ITreeConfig) => {console.log(data);// 初始化svgconst _svg = d3.select('#org-chart-svg').html('');// 获取初始化svg的宽高const {clientWidth: width, clientHeight: height} = _svg.node() as SVGElement;const svg = _svg.attr('viewBox', [0, 0, width, height]);// 渲染组织机构树数据的容器const treeGroup = svg.append('g').attr('class', 'tree-group');treeGroup.append('rect').attr('width', 200).attr('height', 100).attr('fill', 'yellow');// 缩放{// 缩放移动监听const zoom = d3.zoom().scaleExtent([.1, 5]).on('zoom', e => {config.k = e.transform.k;treeGroup.attr('transform', e.transform);});const transform = d3.zoomIdentity.translate(config.x, config.y).scale(config.k);zoom.transform(svg as never, transform, [config.x, config.y]);// 监听缩放拖拽并禁用双击放大功能svg.call(zoom as never).on('dblclick.zoom', null);}};const formatTree = (() => {let count = 0;return function callback(data: ITreeData): ITreeData {return {...data,_id: count++,children: (data.children || []).map(d => callback(d)),_children: (data.children || []).map(d => callback(d)),};};})();useEffect(() => {init(formatTree(TreeData), TreeConfig);}, [formatTree]);return <><svg id="org-chart-svg" className="tree-svg" width="100%" height="100%"></svg></>;
}export default OrgChart;

渲染节点

效果

在这里插入图片描述

源码

import {useEffect} from 'react';
import TreeData from './json/tree-data.json';interface ITreeConfig {nodeWidth: number,nodeHeight: number,spaceX: number,spaceY: number,k: number,x: number,y: number,duration: number,
}interface ITreeData {_id?: number,name: string,children?: ITreeData[] | null,_x0?: number,_y0?: number,
}const d3 = window.d3;const TreeConfig: ITreeConfig = {nodeWidth: 200,nodeHeight: 100,spaceX: 60,spaceY: 100,k: 1,x: 0,y: 0,duration: 500,
};function OrgChart() {const init = (data: ITreeData, config: ITreeConfig) => {console.log(data);// 初始化svgconst _svg = d3.select('#org-chart-svg').html('');// 获取初始化svg的宽高const {clientWidth: width, clientHeight: height} = _svg.node() as SVGElement;const svg = _svg.attr('viewBox', [0, 0, width, height]);// 渲染组织机构树数据的容器const treeGroup = svg.append('g').attr('class', 'tree-group');// 节点组const nodeGroup = treeGroup.append('g').attr('class', 'node-group');// 节点组通用样式nodeGroup.attr('transform', `translate(${(width - config.nodeWidth) / 2}, 20)`).attr('fill', 'rgba(22,119,255,0.6)');// 缩放{// 缩放移动监听const zoom = d3.zoom().scaleExtent([.1, 5]).on('zoom', e => {treeGroup.attr('transform', e.transform);});const transform = d3.zoomIdentity.translate(config.x, config.y).scale(config.k);zoom.transform(svg as never, transform, [config.x, config.y]);// 监听缩放拖拽并禁用双击放大功能svg.call(zoom as never).on('dblclick.zoom', null);}// 将数据处理成存在位置信息的数据const root = d3.hierarchy(data);// 定义节点尺寸const tree = d3.tree().nodeSize([config.nodeWidth + config.spaceX, config.nodeHeight + config.spaceY]);// 初始化节点数据,默认仅展示一个节点root.data._x0 = 0;root.data._y0 = 0;root.descendants().forEach(d => {d.data.children = d.children as unknown as ITreeData[];d.children = undefined;});// 更新节点function update(source: d3.HierarchyNode<ITreeData>) {// 动画时间const transition = svg.transition().duration(config.duration);// 全部节点const nodes = root.descendants();// 处理数据添加坐标tree(root as never);// 处理渲染前数据root.eachBefore(d => {d.data._x0 = d.x || 0;d.data._y0 = d.y || 0;});// 节点处理{const node = nodeGroup.selectChildren('g').data(nodes, d => (d as never)['data']['_id']);const nodeEnter = node.enter().append('g').attr('opacity', 0).attr('transform', `translate(${source.data._x0},${source.data._y0})`);nodeEnter.append('rect').attr('width', config.nodeWidth).attr('height', config.nodeHeight).on('click', (_e, d) => {(d.children as unknown) = d.children ? null : d.data.children;update(d);});nodeEnter.append('text').text(d => d.data.name).attr('x', 20).attr('y', 30).attr('fill', 'red');node.merge(nodeEnter as never).transition(transition).attr('opacity', 1).attr('transform', d => `translate(${d.x},${d.y})`);node.exit().transition(transition).remove().attr('opacity', 0).attr('transform', `translate(${source.x},${source.y})`);}}update(root);};const formatTree = (() => {let count = 0;return function callback(data: ITreeData): ITreeData {return {...data,_id: count++,children: (data.children || []).map(d => callback(d)),};};})();useEffect(() => {init(formatTree(TreeData), TreeConfig);}, [formatTree]);return <><svg id="org-chart-svg" className="tree-svg" width="100%" height="100%"></svg></>;
}export default OrgChart;

渲染连线

效果

在这里插入图片描述

源码

import {useEffect} from 'react';
import TreeData from './json/tree-data.json';interface ITreeConfig {nodeWidth: number,nodeHeight: number,spaceX: number,spaceY: number,k: number,x: number,y: number,duration: number,
}interface ITreeData {_id?: number,name: string,children?: ITreeData[] | null,_x0?: number,_y0?: number,
}const d3 = window.d3;const TreeConfig: ITreeConfig = {nodeWidth: 200,nodeHeight: 100,spaceX: 60,spaceY: 100,k: 1,x: 0,y: 0,duration: 500,
};function OrgChart() {const init = (data: ITreeData, config: ITreeConfig) => {console.log(data);// 初始化svgconst _svg = d3.select('#org-chart-svg').html('');// 获取初始化svg的宽高const {clientWidth: width, clientHeight: height} = _svg.node() as SVGElement;const svg = _svg.attr('viewBox', [0, 0, width, height]);// 渲染组织机构树数据的容器const treeGroup = svg.append('g').attr('class', 'tree-group');// 连线组const linkGroup = treeGroup.append('g').attr('class', 'link-group');// 连线组通用样式linkGroup.attr('transform', `translate(${(width - config.nodeWidth) / 2}, 20)`).attr('fill', 'none').attr('stroke', 'red').attr('stroke-width', 3);// 节点组const nodeGroup = treeGroup.append('g').attr('class', 'node-group');// 节点组通用样式nodeGroup.attr('transform', `translate(${(width - config.nodeWidth) / 2}, 20)`).attr('fill', 'rgba(22,119,255,0.6)');// 缩放{// 缩放移动监听const zoom = d3.zoom().scaleExtent([.1, 5]).on('zoom', e => {treeGroup.attr('transform', e.transform);});const transform = d3.zoomIdentity.translate(config.x, config.y).scale(config.k);zoom.transform(svg as never, transform, [config.x, config.y]);// 监听缩放拖拽并禁用双击放大功能svg.call(zoom as never).on('dblclick.zoom', null);}// 将数据处理成存在位置信息的数据const root = d3.hierarchy(data);// 定义节点尺寸const tree = d3.tree().nodeSize([config.nodeWidth + config.spaceX, config.nodeHeight + config.spaceY]);// 初始化节点数据,默认仅展示一个节点root.data._x0 = 0;root.data._y0 = 0;root.descendants().forEach(d => {d.data.children = d.children as unknown as ITreeData[];d.children = undefined;});// 更新节点function update(source: d3.HierarchyNode<ITreeData>) {// 动画时间const transition = svg.transition().duration(config.duration);// 全部节点const nodes = root.descendants();// 全部连线const links = root.links();// 处理数据添加坐标tree(root as never);// 处理渲染前数据root.eachBefore(d => {d.data._x0 = d.x || 0;d.data._y0 = d.y || 0;});// 节点处理{const node = nodeGroup.selectChildren('g').data(nodes, d => (d as never)['data']['_id']);const nodeEnter = node.enter().append('g').attr('opacity', 0).attr('transform', `translate(${source.data._x0},${source.data._y0})`);nodeEnter.append('rect').attr('width', config.nodeWidth).attr('height', config.nodeHeight).on('click', (_e, d) => {(d.children as unknown) = d.children ? null : d.data.children;update(d);});nodeEnter.append('text').text(d => d.data.name).attr('x', 20).attr('y', 30).attr('fill', 'red');node.merge(nodeEnter as never).transition(transition).attr('opacity', 1).attr('transform', d => `translate(${d.x},${d.y})`);node.exit().transition(transition).remove().attr('opacity', 0).attr('transform', `translate(${source.x},${source.y})`);}// 连线处理{const link = linkGroup.selectChildren('path').data(links, d => (d as never)['target']['data']['_id']);const linkEnter = link.enter().append('path').attr('opacity', 0).attr('d', d => {return [`M${(d.source.data._x0 || 0) + config.nodeWidth / 2}, ${(d.source.data._y0 || 0) + config.nodeHeight}`, // 开始点`L${(d.source.data._x0 || 0) + config.nodeWidth / 2}, ${(d.source.data._y0 || 0) + config.nodeHeight}`, // 开始的转折点`L${(d.source.data._x0 || 0) + config.nodeWidth / 2}, ${(d.source.data._y0 || 0) + config.nodeHeight}`, // 结束的转折点`L${(d.source.data._x0 || 0) + config.nodeWidth / 2}, ${(d.source.data._y0 || 0) + config.nodeHeight}`, // 结束点].join();});link.merge(linkEnter as never).transition(transition).attr('opacity', 1).attr('d', d => {return [`M${(d.source.x || 0) + config.nodeWidth / 2}, ${(d.source.y || 0) + config.nodeHeight}`,                       // 开始点`L${(d.source.x || 0) + config.nodeWidth / 2}, ${(d.source.y || 0) + config.nodeHeight + config.spaceY / 2}`,   // 开始点`L${(d.target.x || 0) + config.nodeWidth / 2}, ${(d.source.y || 0) + config.nodeHeight + config.spaceY / 2}`,   // 结束的转折开始点`L${(d.target.x || 0) + config.nodeWidth / 2}, ${(d.target.y || 0)}`,                                           // 结束点].join();});link.exit().transition(transition).remove().attr('opacity', 0).attr('d', d => {const t = d as d3.HierarchyLink<ITreeData>;return [`M${(t.source.x || 0) + config.nodeWidth / 2}, ${(t.source.y || 0) + config.nodeHeight}`, // 开始点`L${(t.source.x || 0) + config.nodeWidth / 2}, ${(t.source.y || 0) + config.nodeHeight}`, // 开始的转折点`L${(t.source.x || 0) + config.nodeWidth / 2}, ${(t.source.y || 0) + config.nodeHeight}`, // 结束的转折点`L${(t.source.x || 0) + config.nodeWidth / 2}, ${(t.source.y || 0) + config.nodeHeight}`, // 结束点].join();});}}update(root);};const formatTree = (() => {let count = 0;return function callback(data: ITreeData): ITreeData {return {...data,_id: count++,children: (data.children || []).map(d => callback(d)),};};})();useEffect(() => {init(formatTree(TreeData), TreeConfig);}, [formatTree]);return <><svg id="org-chart-svg" className="tree-svg" width="100%" height="100%"></svg></>;
}export default OrgChart;

完整源码

import {useEffect} from 'react';
import TreeData from './json/tree-data.json';interface ITreeConfig {nodeWidth: number,nodeHeight: number,spaceX: number,spaceY: number,k: number,x: number,y: number,duration: number,
}interface ITreeData {_id?: number,name: string,children?: ITreeData[] | null,_x0?: number,_y0?: number,
}const d3 = window.d3;const TreeConfig: ITreeConfig = {nodeWidth: 200,nodeHeight: 100,spaceX: 60,spaceY: 100,k: 1,x: 0,y: 0,duration: 500,
};function OrgChart() {const init = (data: ITreeData, config: ITreeConfig) => {console.log(data);// 初始化svgconst _svg = d3.select('#org-chart-svg').html('');// 获取初始化svg的宽高const {clientWidth: width, clientHeight: height} = _svg.node() as SVGElement;const svg = _svg.attr('viewBox', [0, 0, width, height]);// 渲染组织机构树数据的容器const treeGroup = svg.append('g').attr('class', 'tree-group');// 连线组const linkGroup = treeGroup.append('g').attr('class', 'link-group');// 连线组通用样式linkGroup.attr('transform', `translate(${(width - config.nodeWidth) / 2}, 20)`).attr('fill', 'none').attr('stroke', 'red').attr('stroke-width', 3);// 节点组const nodeGroup = treeGroup.append('g').attr('class', 'node-group');// 节点组通用样式nodeGroup.attr('transform', `translate(${(width - config.nodeWidth) / 2}, 20)`).attr('fill', 'rgba(22,119,255,0.6)');// 缩放{// 缩放移动监听const zoom = d3.zoom().scaleExtent([.1, 5]).on('zoom', e => {treeGroup.attr('transform', e.transform);});const transform = d3.zoomIdentity.translate(config.x, config.y).scale(config.k);zoom.transform(svg as never, transform, [config.x, config.y]);// 监听缩放拖拽并禁用双击放大功能svg.call(zoom as never).on('dblclick.zoom', null);}// 将数据处理成存在位置信息的数据const root = d3.hierarchy(data);// 定义节点尺寸const tree = d3.tree().nodeSize([config.nodeWidth + config.spaceX, config.nodeHeight + config.spaceY]);// 初始化节点数据,默认仅展示一个节点root.data._x0 = 0;root.data._y0 = 0;root.descendants().forEach(d => {d.data.children = d.children as unknown as ITreeData[];d.children = undefined;});// 更新节点function update(source: d3.HierarchyNode<ITreeData>) {// 动画时间const transition = svg.transition().duration(config.duration);// 全部节点const nodes = root.descendants();// 全部连线const links = root.links();// 处理数据添加坐标tree(root as never);// 处理渲染前数据root.eachBefore(d => {d.data._x0 = d.x || 0;d.data._y0 = d.y || 0;});// 节点处理{const node = nodeGroup.selectChildren('g').data(nodes, d => (d as never)['data']['_id']);const nodeEnter = node.enter().append('g').attr('opacity', 0).attr('transform', `translate(${source.data._x0},${source.data._y0})`);nodeEnter.append('rect').attr('width', config.nodeWidth).attr('height', config.nodeHeight).on('click', (_e, d) => {(d.children as unknown) = d.children ? null : d.data.children;update(d);});nodeEnter.append('text').text(d => d.data.name).attr('x', 20).attr('y', 30).attr('fill', 'red');node.merge(nodeEnter as never).transition(transition).attr('opacity', 1).attr('transform', d => `translate(${d.x},${d.y})`);node.exit().transition(transition).remove().attr('opacity', 0).attr('transform', `translate(${source.x},${source.y})`);}// 连线处理{const link = linkGroup.selectChildren('path').data(links, d => (d as never)['target']['data']['_id']);const linkEnter = link.enter().append('path').attr('opacity', 0).attr('d', d => {return [`M${(d.source.data._x0 || 0) + config.nodeWidth / 2}, ${(d.source.data._y0 || 0) + config.nodeHeight}`, // 开始点`L${(d.source.data._x0 || 0) + config.nodeWidth / 2}, ${(d.source.data._y0 || 0) + config.nodeHeight}`, // 开始的转折点`L${(d.source.data._x0 || 0) + config.nodeWidth / 2}, ${(d.source.data._y0 || 0) + config.nodeHeight}`, // 结束的转折点`L${(d.source.data._x0 || 0) + config.nodeWidth / 2}, ${(d.source.data._y0 || 0) + config.nodeHeight}`, // 结束点].join();});link.merge(linkEnter as never).transition(transition).attr('opacity', 1).attr('d', d => {return [`M${(d.source.x || 0) + config.nodeWidth / 2}, ${(d.source.y || 0) + config.nodeHeight}`,                       // 开始点`L${(d.source.x || 0) + config.nodeWidth / 2}, ${(d.source.y || 0) + config.nodeHeight + config.spaceY / 2}`,   // 开始点`L${(d.target.x || 0) + config.nodeWidth / 2}, ${(d.source.y || 0) + config.nodeHeight + config.spaceY / 2}`,   // 结束的转折开始点`L${(d.target.x || 0) + config.nodeWidth / 2}, ${(d.target.y || 0)}`,                                           // 结束点].join();});link.exit().transition(transition).remove().attr('opacity', 0).attr('d', d => {const t = d as d3.HierarchyLink<ITreeData>;return [`M${(t.source.x || 0) + config.nodeWidth / 2}, ${(t.source.y || 0) + config.nodeHeight}`, // 开始点`L${(t.source.x || 0) + config.nodeWidth / 2}, ${(t.source.y || 0) + config.nodeHeight}`, // 开始的转折点`L${(t.source.x || 0) + config.nodeWidth / 2}, ${(t.source.y || 0) + config.nodeHeight}`, // 结束的转折点`L${(t.source.x || 0) + config.nodeWidth / 2}, ${(t.source.y || 0) + config.nodeHeight}`, // 结束点].join();});}}update(root);};const formatTree = (() => {let count = 0;return function callback(data: ITreeData): ITreeData {return {...data,_id: count++,children: (data.children || []).map(d => callback(d)),};};})();useEffect(() => {init(formatTree(TreeData), TreeConfig);}, [formatTree]);return <><svg id="org-chart-svg" className="tree-svg" width="100%" height="100%"></svg></>;
}export default OrgChart;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/450338.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

crd介绍

在 Kubernetes 中&#xff0c;CRD&#xff08;Custom Resource Definition&#xff09;和 CR&#xff08;Custom Resource&#xff09;是用于扩展 Kubernetes 功能的机制。它们的关系和使用可以用一个完整案例来说明。 定义 CRD&#xff08;Custom Resource Definition&#x…

中后台 B 端产品设计

中后台 B 端产品设计 一、设计目标二、设计流程三、设计要点四、相关模块 叮嘟&#xff01;这里是小啊呜的学习课程资料整理。好记性不如烂笔头&#xff0c;今天也是努力进步的一天。一起加油进阶吧&#xff01; 中后台B端产品设计&#xff1a; 是指针对企业内部业务人员和管理…

python+appium+雷电模拟器安卓自动化及踩坑

一、环境安装 环境&#xff1a;window11 1.1 安装Android SDK AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载 这里面任选一个就可以&#xff0c;最终下载完主要要安装操作安卓的工具adb&#xff0c;安装这个步骤的前提是要…

Linux驱动开发——设备树

文章目录 1 什么是设备树&#xff1f;2 DTS、DTB和DTC3 DTS语法3.1 dtsi头文件3.2 设备节点3.3 标准属性3.4 根节点compatible属性3.5 向节点追加或修改内容 4 创建小型模板设备树5 设备树在系统中的体现6 绑定信息文档7 设备树常用OF操作函数7.1 查找节点的OF函数7.2 查找父/子…

【工具变量】上市公司当年是否发生财务重述指标整理Stata代码(2000-2023年)

计算说明&#xff1a;使用财务重述公告中所更正年报对应的年度作为财务重述的年度&#xff0c;若企业年报中发生财务重述取1&#xff0c;否则取0。本示例的财务重述是指上市公司对以前年度财务报表中的会计差错进行更正和披露&#xff0c;不包括股票拆分、股票红利、终止经营、…

Java 类和对象详解(上 )

个人主页&#xff1a; 鲤鱼王打挺-CSDN博客 Java专栏&#xff1a;https://blog.csdn.net/2401_83779763/category_12801101.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12801101&sharereferPC&sharesource2401_83779763&sharefromfrom_link &…

SwiftUI 如何取得 @Environment 中 @Observable 对象的绑定?

概述 从 SwiftUI 5.0&#xff08;iOS 17&#xff09;开始&#xff0c;苹果推出了全新的 Observation 框架。它作为下一代内容改变响应者全面参与到数据流和事件流的系统中。 有了 Observation 框架的加持&#xff0c;原本需要多种状态类型的 SwiftUI 视图现在只需要 3 种即可大…

R语言详解predict函数

R语言中predict函数在建立模型&#xff0c;研究关系时常用。但是不同type得到的结果常常被混为一谈&#xff0c;接下来&#xff0c;探讨predict得到的不同结果。 #数据 set.seed(123) n<-1000 age<-rnorm(n,mean50,sd10) gender<-rbinom(n,1,0.5) disease<-rbinom…

CDC变更数据捕捉技术是什么?和ETL有什么不同?

一、什么是CDC技术? 变更数据捕获&#xff08;Change Data Capture&#xff0c;简称 CDC&#xff09;是一种用于识别和跟踪数据源中发生变化的数据的技术。 工作原理&#xff1a; 1.监测数据源&#xff1a;CDC 工具会持续监测指定的数据源&#xff0c;如数据库表、文件系统…

【踩坑随笔】Tensorflow-GPU训练踩坑

一个无语的坑&#xff0c;4060单卡训练&#xff0c;8G内存本来就不够&#xff0c;还没开始训练就已经爆内存了&#xff0c;但是居然正常跑完了训练&#xff0c;然后一推理发现结果就是一坨。。。往回翻日志才发现原来中间有异常。 首先解决第一个问题&#xff1a;Could not lo…

k8s部署Kafka集群超详细讲解

准备部署环境 Kubernetes集群信息 NAMEVERSIONk8s-masterv1.29.2k8s-node01v1.29.2k8s-node02v1.29.2 Kafka&#xff1a;3.7.1版本&#xff0c;apche版本 Zookeeper&#xff1a;3.6.3版本 准备StorageClass # kubectl get sc NAME PROVISIONER RECLA…

音频文件处理 m4a 格式转为 wav 格式 - python 实现

在做音频算法开发时&#xff0c;有时获取的样本为 .m4a格式需要将其转为 .wav,方便之后的数据处理。 安装 python 库&#xff1a; pip install AudioSegment 代码实现具体如下&#xff1a; #-*-coding:utf-8-*- # date:2024-10 # Author: DataBall - XIAN # Function: 音频文件…

LIN从节点:波特率测试

文章目录 1、为什么需要测&#xff1f;2、如何实现测试&#xff1f;3、测试结果4、注意事项 1、为什么需要测&#xff1f; 调节波特率的变化&#xff0c;使主节点同步场位速率变化&#xff0c;验证从节点能否通过同步段进行调节自身位速率。对应ISO17987协议。 2、如何实现测…

锥线性规划【分布鲁棒、两阶段鲁棒方向知识点】

1 锥线性对偶理论 本部分看似和分布鲁棒、两阶段鲁棒优化没什么关系&#xff0c;但值得优先学习&#xff0c;原因将在最后揭晓。 二阶锥 二阶锥&#xff08;second-order cone&#xff0c;又称ice-cream/Lorentz cone&#xff09;的形式为&#xff1a; 非负象限锥 半正定锥 …

jmeter出参保存到文件,保存失败解决

1、添加JSON提取 2、添加beanshell FileWriter writer new FileWriter("C:/Users/xxx/Desktop/signUrl.csv", true); writer.write(vars.get("company_name")"\t"vars.get("signUrl")"\n"); writer.close(); 写文件的两个…

python的多线程和多进程

首先需要明确的是&#xff0c;多进程和其他语言的一样&#xff0c;能够利用多核cpu&#xff0c;但是python由于GIL的存在&#xff0c;多线程在执行的时候&#xff0c;实际上&#xff0c;每一时刻只有一个线程在执行。相当于是单线程。然而多线程在某些情况下&#xff0c;还是能…

Go-知识泛型

Go-知识泛型 1. 认识泛型1.1 不使用泛型1.2 使用泛型 2. 泛型的特点2.1 函数泛化2.2 类型泛化 3. 类型约束3.1 类型集合3.2 interface 类型集合3.2.1 内置interface类型集合3.2.2 自定义interface类型集合3.2.2.1 任意类型元素3.2.2.2 近似类型元素3.2.2.3 联合类型元素 3.2.3 …

Windows上安装Go并配置环境变量(图文步骤)

前言 1. 本文主要讲解的是在windows上安装Go语言的环境和配置环境变量&#xff1b; Go语言版本&#xff1a;1.23.2 Windows版本&#xff1a;win11&#xff08;win10通用&#xff09; 下载Go环境 下载go环境&#xff1a;Go下载官网链接(https://golang.google.cn/dl/) 等待…

Windows的一些技巧

一、如何去掉桌面程序图标的小箭头 1、使用WIN + R 快捷键调出运行窗口 2、在运行 窗口输入 regedit,打开注册表编辑器 3、在注册表编辑器 中找到 HKEY_CLASSES_ROOT\lnkfile 4、在右侧窗格中找到 IsShortcut 项,右键 删除 二、WIN10如何打开图片查看器 1、使用WIN + R 快…

kali——hping3的使用

目录 前言 ping测试 端口扫描 ​编辑 源IP伪造 修改TTL值 洪水攻击 ​编辑 前言 hping命令行工具主要用于构造和发送自定义的 TCP/IP 数据包。它是一个非常强大的工具&#xff0c;用于网络测试、安全审计和防火墙测试。 ping测试 hping3 -1 目标IP //此命令…