文档章节

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

ios122
 ios122
发布于 2017/10/09 03:55
字数 1096
阅读 2750
收藏 56
点赞 3
评论 5

简介

预览

国庆看完 << 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.5

	datas.map((data)=>{
		let itemId = data.ImportPath

		nodes.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.id
		if(nodedSize[itemId]){
			item.size = nodedSize[itemId]
		}
	})

	return {
		nodes,edges
	}
}

效果与源码

相关链接

© 著作权归作者所有

共有 人打赏支持
ios122
粉丝 71
博文 73
码字总数 128197
作品 3
东城
程序员
加载中

评论(5)

ios122
ios122

引用来自“进击的代码”的评论

引用来自“Acce1erator”的评论

这语言已经明确说了 名字就是go 还golang golang叫个不停

习惯了估计,他官网网址还仍然是golang.org
+1
进击的代码
进击的代码

引用来自“Acce1erator”的评论

这语言已经明确说了 名字就是go 还golang golang叫个不停

习惯了估计,他官网网址还仍然是golang.org
Acce1erator
Acce1erator
这语言已经明确说了 名字就是go 还golang golang叫个不停
s
sapling123
学习了,支持楼主
胖纸囧
胖纸囧
感谢分享,支持。
数据可视化(五)基于网络爬虫制作可视化图表

基于网络爬虫的可视化图表:golang,goquery 案例:最近十年全国彩票销售变化情况 案例:中国科学院院士分布 数据可视化技术方案:基于 SVG (D3、Raphael)、基于 Canvas(Echarts) 我们身处大数...

RiboseYim ⋅ 01/11 ⋅ 0

数据可视化工具大集合

摘要:所谓数据可视化是对大型数据库或数据仓库中的数据的可视化,它是可视化技术在非空间数据领域的应用,使人们不再局限于通过关系数据表来观察和分析数据信息,还能以更直观的方式看到数据...

阿里云云栖社区 ⋅ 2017/12/04 ⋅ 0

数据可视化之美:经典案例与实践解析

作者:jihong10102006 随着DT时代的到来,传统的统计图表很难对复杂数据进行直观地展示。这几年数据可视化作为一个新研究领域也变得越来越火。成功的可视化,如果做得漂亮,虽表面简单却富含...

op07p6aaqo9u71 ⋅ 2017/10/26 ⋅ 0

GoHub 更新至 0.6,在线 Golang 文档阅读

GoHub 更新至 0.6,基于 Github REST API v3 的 Golang 在线文档。 GoHub WIP (尚在开发中...) GoHub 使用 Github REST API v3 提供在线 Golang 文档阅读. 便捷的文档项目组织 Go Doc API 翻...

喻恒春 ⋅ 05/21 ⋅ 0

C++协程库--orchid

orchid是一个构建于强大的boost库基础上的C++库,类似于python下的gevent/eventlet,为用户提供基于协程的并发模型。 协程,顾名思义,协作式程序,其思想是,一系列互相依赖的协程间依次使用...

江浸月 ⋅ 2012/12/27 ⋅ 0

Python 调用 matplotlib 实现交互式数据可视化图表案例

交互式的数据可视化图表是 New IT 新技术的一个应用方向,在过去,用户要在网页上查看数据,基本的实现方式就是在页面上显示一个表格出来,的而且确,用表格的方式来展示数据,显示的数据量会...

xjtuhit ⋅ 06/11 ⋅ 0

推荐 14 款基于 JavaScript 的数据可视化工具

俗话说,一图胜千言。图形化的信息可以让人们对数据有更加直观清晰的理解,让信息发布者更加高效地展示自己的核心内容。在前端开发中,如果缺少合适工具,制作数据可视化图表会十分复杂。然而...

勿忘初心321 ⋅ 2015/12/28 ⋅ 12

39个大数据可视化工具 数据研究必备

数据可视化无处不在,而且比以前任何时候都重要。无论是在行政演示中为数据点创建一个可视化进程,还是用可视化概念来细分客户,数据可视化都显得尤为重要。以前的工具的基本不能处理大数据。...

小数点 ⋅ 2017/12/07 ⋅ 0

Go 1.5交叉编译

Go 1.5的交叉编译非常简单,基本用法如下: GOOS=os GOARCH=arch go build packages os: , , , arch: , amd64, arm... os和arch的组合可参考: https://golang.org/doc/install/source#envir......

chinaweilu ⋅ 2015/12/26 ⋅ 0

译文:写在Go测试代码中例子(原文:Testable Examples in Go)

原文: 简介 Go自动生成的文档中有时你会看到代码例子,这些例子还可以通过点击网站上的Run按钮运行。而这些例子是从测试代码中提取出来的。 这些代码例子是具有可测性的,而带来的优点就是当...

go-skyblue ⋅ 2016/05/05 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Mahout基于内存的DataMode 推荐引擎Demo2

Mahout基于内存的DataMode 推荐引擎Demo2 //注释的部分是基于文件也可以理解为基于日志文件的, //DataModel 可以有很多种,实现abstractDataMode的子类,原则上都可以作为数据源,个人觉得,...

xiaomin0322 ⋅ 30分钟前 ⋅ 0

Docker部署Tomcat及Web应用

一、在线下载docker yum install -y epel-releaseyum install docker-io # 安装dockerchkconfig docker on # 加入开机启动service docker start # 启动docker服务 1 ...

Jeam_ ⋅ 30分钟前 ⋅ 0

研发运营一体化能力成熟度模型

研发运营一体化是指在 IT 软件及相关服务的研发及交付过程中,将应用的需求、开发、测试、部 署和运营统一起来,基于整个组织的协作和应用架构的优化,实现敏捷开发、持续交付和应用运营的无...

stars永恒 ⋅ 35分钟前 ⋅ 0

jQuery缩小放大触发事件

jquery的resize()方法使用 <html> <head> <script type="text/javascript" src="/jquery/jquery.js"></script> <script type="text/javascript"> var i = 0; $(document).ready(function(){ ......

RobertZou ⋅ 36分钟前 ⋅ 0

eclipse python 搭建

https://jingyan.baidu.com/article/9113f81b68ebce2b3214c7e0.html https://www.cnblogs.com/ZhangRuoXu/p/6397756.html https://blog.csdn.net/zhangphil/article/details/78962159 字符集......

之渊 ⋅ 36分钟前 ⋅ 0

weex,react native,flutter

weex: 一次编写,处处运行 RN: 学一次,到处写(针对安卓,IOS平台特性 各自写,会有很大一部分是一样的代码) 这些方案是否真正的解决了跨平台问题呢?从目前的状况来看,很显然是没有的,因...

东东笔记 ⋅ 42分钟前 ⋅ 0

Spring Cloud微服务分布式云架构-集成项目

Spring Cloud集成项目有很多,下面我们列举一下和Spring Cloud相关的优秀项目,我们的企业架构中用到了很多的优秀项目,说白了,也是站在巨人的肩膀上去整合的。在学习Spring Cloud之前大家必...

明理萝 ⋅ 47分钟前 ⋅ 1

SpringMVC图片上传问题解决

当我们上传图片时一直发现: MultipartFile file = null; if (request instanceof MultipartHttpServletRequest) 匹配不上, 解决方案: 在前端xml加入如下配置代码即可 <!-- 图片上传bean --...

泉天下 ⋅ 49分钟前 ⋅ 0

Spring表达式语言(SpEL)

1、SpEL引用 Spring EL在bean创建时执行其中的表达式。此外,所有的Spring表达式都可以通过XML或注解的方式实现。下面将使用Spring表达式语言(SpEL),注入字符串,整数,Bean到属性。 SpEL的...

霍淇滨 ⋅ 今天 ⋅ 0

Gradle使用阿里云镜像

gradle 生命周期中有一个初始化( Initialization )的过程,这个过程运行在 build script 之前,我们可以在这个地方做一点系统全局的设置,如配置仓库地址。 你可以在以下几个位置实现仓库地址...

明MikeWoo ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部