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.pswp.cn/news/282211.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282211.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282211.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Amazon Alexa 新里程碑: 50000 個功能、 20000 種設備、 3500 個品牌

幾個月過去&#xff0c;Alexa的設備連接量、活躍度等各項數據又攀升了。昨日&#xff0c;亞馬遜智慧家庭副總裁DanielRausch在IFA大會上公布了Alexa的各項數據&#xff1a;全球范圍內&#xff0c;Alexa已經擁有50000個功能&#xff0c;與20000種設備相容&#xff0c;并與超過35…

C# 計算耗時的三種方法

概述計算一段程序的耗時是我們在編程中很常見的用法&#xff0c;那這節內容就通過實例的方式來演示幾種常用的統計耗時的方法.方法一&#xff1a;stopwatchstatic void Main(string[] args){Stopwatch sw new Stopwatch();sw.Start();Thread.Sleep(999);sw.Stop();Console.Wri…

《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;肯德里克科爾曼&…

SqlKata - 方便好用的 Sql query builder

SqlKata查詢生成器是一個用C# 編寫的功能強大的Sql查詢生成器。它是安全的&#xff0c;與框架無關。靈感來源于可用的頂級查詢生成器&#xff0c;如Laravel Query Builder和 Knex&#xff1a;https://knexjs.org/。SqlKata有一個富有表現力的API。它遵循一個干凈的命名約定&…

編寫高質量代碼:改善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…

摘要,日志

1.hashlib 模塊: 由于數據的不安全性,為了保證用戶的信息絕對安全,所有所有人的賬號密碼不能以明文的形式存儲, 而是經過適當的處理以密文的形式存儲. hashlib對同一個字符串在不同的語言,不同的環境(操作系統,版本,時間)中加密得到的是同一個密文串,不同的字符串得到的密文是不…

《網站情感化設計與內容策略》一第1章 情感化設計1.1 革命:有失亦有得

本節書摘來自異步社區《網站情感化設計與內容策略》一書中的第1章&#xff0c;第1.1節&#xff0c;作者 【美】Aarron Walter , Erin Kissane&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看 第1章 情感化設計 網站情感化設計與內容策略 1.1 革命&#xff1…

php自動加載機制的實現

一、什么是自動加載 自動加載就是當我們在當前文件中實例化一個不存在的類時&#xff0c;調用自動加載機制引入相應的類文件。 注&#xff1a;自動加載有兩種方式&#xff08;都是php內置的&#xff09;&#xff0c;一種是通過__autoload(),另一種是通過spl_autoload_registe…

MySQL之 從復制延遲問題排查

一、從庫復制延遲問題 1、可能的原因如下&#xff08;1&#xff09;主從服務器處于不同的網絡之中&#xff0c;由于網絡延遲導致&#xff1b;&#xff08;2&#xff09;主從服務器的硬件配置不同&#xff0c;從服務器的硬件配置&#xff08;包括內存&#xff0c;CPU&#xff0c…

《樹莓派滲透測試實戰》——2.12 用例子總結以上步驟

本節書摘來異步社區《樹莓派滲透測試實戰》一書中的第2章&#xff0c;第2.12節&#xff0c;作者【美】Joseph Muniz&#xff08;約瑟夫 穆尼斯&#xff09; , Aamir Lakhani&#xff08;阿米爾 拉克哈尼&#xff09;&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號…

申請成為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;通過此工具可以輕松輸入、編譯…

基于.NetCore開發博客項目 StarBlog - (18) 實現本地Typora文章打包上傳

1前言九月太忙&#xff0c;只更新了三篇文章&#xff0c;本來這個功能是從九月初就開始做的&#xff0c;結果一直拖到現在國慶假期才有時間完善并且寫文章~之前我更新了幾篇關于 Python 的文章&#xff0c;有朋友留言問是不是不更新 .Net 了&#xff0c;那肯定不能啊&#xff0…