golang 标准库间依赖的可视化展示

简介

801860-20171009035407105-1488482403.png

国庆看完 << Go 语言圣经 >>,总想做点什么,来加深下印象.以可视化的方式展示 golang 标准库之间的依赖,可能是一个比较好的切入点.做之前,简单搜了下相关的内容,网上也要讨论,但是没有发现直接能拿过来用的.标准库之间,是必然存在依赖关系的,不同库被依赖的程度必然是不一样的.但究竟有多大差别呢?

以下内容,数据源自真实环境的 golang 1.9 版本的标准库.所以,本文不仅是一篇可视化相关的讨论文章,更是提供了一个可以直接探究 golang 标准库间依赖关系的快速梳理工具.

数据准备

标准库各个包之间的相互关系,可以直接通过命令获取,然后简单变换为一个标准的 JSON 对象:

go list -json  std

示例输出:

{"Dir": "/usr/local/go/src/archive/tar","ImportPath": "archive/tar","Name": "tar","Doc": "Package tar implements access to tar archives.","Target": "/usr/local/go/pkg/darwin_amd64/archive/tar.a","Goroot": true,"Standard": true,"StaleReason": "standard package in Go release distribution","Root": "/usr/local/go","GoFiles": ["common.go","format.go","reader.go","stat_atimespec.go","stat_unix.go","strconv.go","writer.go"],"IgnoredGoFiles": ["stat_atim.go"],"Imports": ["bytes","errors","fmt","io","io/ioutil","math","os","path","sort","strconv","strings","syscall","time"],"Deps": ["bytes","errors","fmt","internal/cpu","internal/poll","internal/race","io","io/ioutil","math","os","path","path/filepath","reflect","runtime","runtime/internal/atomic","runtime/internal/sys","sort","strconv","strings","sync","sync/atomic","syscall","time","unicode","unicode/utf8","unsafe"],"TestGoFiles": ["reader_test.go","strconv_test.go","tar_test.go","writer_test.go"],"TestImports": ["bytes","crypto/md5","fmt","internal/testenv","io","io/ioutil","math","os","path","path/filepath","reflect","sort","strings","testing","testing/iotest","time"],"XTestGoFiles": ["example_test.go"],"XTestImports": ["archive/tar","bytes","fmt","io","log","os"]
}

梳理过的数据源,参见: https://raw.githubusercontent.com/ios122/graph-go/master/data.js

可视化原理

主要涉及一下内容:

  • 可视化显示,使用的是 echarts

  • 使用原始数据的 ImportPath 而不是 Name,来作为每个数据节点的唯一id.这样是因为 golang 本身的包命名规范决定的.

  • 使用原始数据的 Imports 字段,来确定标准库包与包之间的相互依赖关系.golang是不允许循环依赖的,所以一些循环依赖相关的问题,不需要考虑.

  • 节点的大小,和包被其他包引入的次数成正相关.这样做,被依赖越多的包,图上最终显示时,就会越大.常用包和不常用包,一目了然.

数据整理

就是把原始数据,处理成 echarts 需要的数据,这里简要说下最核心的思路:

  • echarts 显示相关的代码,很大程度上参考了 graph-npm

  • 节点坐标和颜色,采用随机坐标和颜色,以去除节点和包之间的联系.我认为这样处理,能更纯粹地观察标准库包与包之间的联系.

  • 需要一个 edges 来记录包与包之间的依赖关系.在每次遍历 Imports 时,动态写入.

  • 需要一个 nodes 来记录包自身的一些信息,但是其 size 参数,需要计算过所有依赖关系后再填入.

  • 使用 nodedSize 来记录每个包被依赖的次数,为了提升效率,它是一个字典Map.

 /* 将原始数据,转换为图标友好的数据. ImportPath 作为唯一 id 和 标签;Imports 用于计算依赖关系;节点的大小,取决于被依赖的次数;*/
function transData(datas){/* 存储依赖路径信息. */let edges = []/* 存储基础节点信息. */let nodes = []/* 节点尺寸.初始是1, 每被引入一次再加1. */let nodedSize = {}/* 尺寸单位1. */let unitSize = 1.5datas.map((data)=>{let itemId = data.ImportPathnodes.push({"label": itemId,"attributes": {},"id": itemId,"size": 1})if(data.Imports){data.Imports.map((importItem)=>{edges.push({"sourceID": importItem,"attributes": {},"targetID": itemId,"size": unitSize})if(nodedSize[importItem]){nodedSize[importItem] = nodedSize[importItem] + unitSize}else{nodedSize[importItem] = unitSize}})}})/* 尺寸数据合并到节点上. */nodes.map((item)=>{let itemId = item.idif(nodedSize[itemId]){item.size = nodedSize[itemId]}})return {nodes,edges}
}

效果与源码

  • github 源码: https://github.com/ios122/graph-go
  • echarts 在线预览: http://gallery.echartsjs.com/editor.html?c=xSyJNqh8nW

相关链接

  • echarts
  • graph-npm

转载于:https://www.cnblogs.com/ios122/p/7639478.html

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

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

相关文章

《HTML5 2D游戏编程核心技术》——第1章,第1.3节特别功能

本节书摘来自华章出版社《HTML5 2D游戏编程核心技术》一书中的第1章&#xff0c;第1.3节特别功能&#xff0c;作者&#xff3b;美&#xff3d; 戴维吉尔里&#xff0c;更多章节内容可以访问云栖社区“华章计算机”公众号查看。 1.3 特别功能 Snail Bait游戏有3个特别的功能&a…

XunSearch的安装和加入服务器开机脚本以及将目录写入系统变量

一、安装xunserach 1、cd ~ 2、wget http://www.xunsearch.com/download/xunsearch-full-latest.tar.bz2 #下载最新xunsearch包 3、tar -xjf xunsearch-full-latest.tar.bz2 #解压xunsearch包 4、cd xunsearch-full-1.4.11/ #进入xunsearch包目录 5、sh setup.sh #执…

dubbo源码解析-zookeeper创建节点

前言 在之前dubbo源码解析-本地暴露中的前言部分提到了两道高频的面试题,其中一道dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,那发布者和订阅者还能通信吗?在上周的dubbo源码解析-zookeeper连接中已经讲到,这周解析的是另一道,即服务提供者能实现失效踢出是根据什么原…

配置mysql为主主复制步骤

mysql版本&#xff1a;mysql-5.6.24-solaris10-sparc-64bit.tar 操作系统&#xff1a;solaris 11g u10 操作用户&#xff1a;使用非root进行操作安装&#xff0c;a路服务器ip地址为192.168.1.1 b路ip地址为192.168.1.2&#xff08;应改为实际ip地址&#xff09; 1&#xff0c;安…

XunSearch的使用

一、项目的配置文件 1、要想使用xunsearch&#xff0c;首先需要进行配置文件的配置。 默认目录在app下&#xff0c;如下面的结构&#xff0c;每一个搜索项目都需要有一个ini文件进行相应的配置。 举例&#xff1a; project.name novel project.default_charset utf-8 serv…

《VMware vSphere设计(原书第2版)》——1.1 什么是设计

本节书摘来自华章出版社《VMware vSphere设计&#xff08;原书第2版&#xff09;》一 书中的第1章&#xff0c;第1.1节&#xff0c;作者&#xff1a;[美] 福布斯格思里&#xff08;Forbes Guthrie&#xff09;斯科特罗威&#xff08;Scott Lowe&#xff09;肯德里克科尔曼&…

编写高质量代码:改善Java的151个建议四(基本类型)21-30

该书籍PDF下载地址&#xff1a;http://download.csdn.net/download/muyeju/10001473 基本类型有8个&#xff1a;byte&#xff0c;short&#xff0c;int&#xff0c;char&#xff0c;long&#xff0c;double&#xff0c;float&#xff0c;boolean 21.用偶判断&#xff0c;不用奇…

ABP vNext微服务架构详细教程(补充篇)——单层模板(下)

业务代码2聚合服务聚合服务层和基础服务层相同的道理&#xff0c;在Demo.Core.Contracts增加Services文件夹&#xff0c;并添加Notifications子文件夹&#xff0c;在其中添加Dtos文件夹并添加两个DTO与基础服务对应&#xff1a;using Volo.Abp.Application.Dtos;namespace Demo…

PHP 电子商城基本数据表

1、品牌表 tp_brand CREATE TABLE tp_brand (id smallint(5) unsigned NOT NULL AUTO_INCREMENT COMMENT 品牌表,name varchar(60) NOT NULL DEFAULT COMMENT 品牌名称,logo varchar(80) NOT NULL DEFAULT COMMENT 品牌logo,desc text NOT NULL COMMENT 品牌描述,url varcha…

申请成为qq互联个人开发者步骤(注意事项)2018

一、官方网址 官方地址&#xff1a;https://connect.qq.com/manage.html#/ 二、申请时注意事项&#xff1a; 1、申请时的名称栏必须填写身份证上的姓名&#xff0c;否则是不给通过的 2、上传照片时&#xff0c;需要本人手持身份证&#xff0c;重点是照片中身份证上头像的位置要…

《Swift开发实战》——第1章,第1.4节启动iOS 8模拟器

本节书摘来自异步社区《Swift开发实战》一书中的第1章&#xff0c;第1.4节启动iOS 8模拟器&#xff0c;作者 李宁&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 1.4 启动iOS 8模拟器Xcode是一款功能全面的应用程序&#xff0c;通过此工具可以轻松输入、编译…

《算法导论》读书笔记--第1、2章课后题 (转)

第一章 转自http://www.cnblogs.com/batteryhp/p/4654860.html 思考题 1-1&#xff08;运行时间的比较&#xff09;确定时间t内求解的问题的最大规模。 上面是网上提供的答案。 注意点&#xff1a; 1、最左边一列的是关于n的增长情况描述&#xff0c;值得记住的是这些增长的排…

PHP开发自己的框架必备知识点

一、PHP常用的四种数据结构 简介&#xff1a;spl是php的一个标准库。 官方文档&#xff1a;http://php.net/manual/zh/book.spl.php <?php//spl&#xff08;php标准库&#xff09;数据结构/*** 栈&#xff08;先进后出&#xff09;*/ $stack new SplStack(); $stack-&g…

Linux 环境下 jdk1.8 maven3.2.3 Git2.8.0 安装脚本

2019独角兽企业重金招聘Python工程师标准>>> # Author: peizhouyu # Date: 2018-09-07 14:24:11 # Last Modified by: peizhouyu # Last Modified time: 2018-09-07 16:02:58#!/bin/bash SOFT_PATH/opt/softif [ ! -d $SOFT_PATH ];then mkdir $SOFT_PATH else …

《嵌入式设备驱动开发精解》——导读

前言 嵌入式设备驱动开发精解本书的编写主要是针对从事嵌入式软件开发人员。本书的内容主要涵盖ARM CPU以及各种常用外部设备驱动开发的方方面面&#xff0c;包括各种硬件接口、硬件接口协议说明以及各种外设的使用及调试方法&#xff0c;特别是对于开发调试过程中可能遇到的各…

C# WPF通过WindowChrome自定义窗体

概述在WPF界面开发中&#xff0c;系统默认的窗口比较丑&#xff0c;有时候想自定义窗体&#xff0c;比如微信的客户端窗口这样&#xff1a;使得左边的一块顶到最上端&#xff0c;如下图所示&#xff1a;这时候我们可以 WindowStyle"None"&#xff0c;AllowsTranspare…

【转载】递推公式的特征方程及通项公式

先贴上链接&#xff1a;http://blog.csdn.net/happykocola/article/details/73933314 因为最近在复习初赛&#xff0c;然后碰到了这道题&#xff0c;并不会做&#xff0c;才发现有这么高明的方法... 已知递推关系式&#xff1a; f(n)5f(n-1)-6f(n-2) (n>1) f(0)1 f(1)…

【leetcode】75. Sort Colors

题目如下&#xff1a; 解题思路&#xff1a;我的解题思路是遍历数组&#xff0c;遇到0删除该元素并插入到数组头部&#xff0c;遇到1则不处理&#xff0c;遇到2删除该元素并插入到数组尾部。 代码如下&#xff1a; class Solution(object):def sortColors(self, nums):"&q…

Seal-Report: 开放式数据库报表工具

Seal Report是.Net的一个基于Apache 2.0 开源工具&#xff0c;完全用C# 语言编写&#xff0c;最新的6.6 版本采用.NET 6&#xff0c;github: https://github.com/ariacom/Seal-Report。Seal Report提供了一个完整的框架&#xff0c;用于从任何数据库或任何非SQL源生成每日报告。…

《Ceph源码分析》——第2章,第2节Buffer

本节书摘来自华章出版社《Ceph源码分析》一书中的第2章&#xff0c;第2.2节Buffer&#xff0c;作者常涛&#xff0c;更多章节内容可以访问云栖社区“华章计算机”公众号查看 2.2 BufferBuffer就是一个命名空间&#xff0c;在这个命名空间下定义了Buffer相关的数据结构, 这些数…