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 需求的数额,那里大概说下最主题的思路:

  • 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
    }
    

    }

职能与源码

简介

美学原理 1

国庆看完 << Go 语言圣经
>>,总想做点什么,来深化下印象.以可视化的格局显示 golang
标准库之间的信赖,可能是一个比较好的切入点.做事先,简单搜了下有关的始末,网上也要探究,但是没有察觉一贯能拿过来用的.标准库之间,是一定存在依靠关系的,不一致库被着重的程度必然是不均等的.但究竟有多大差异吗?

以下内容,数据源自真实环境的 golang 1.9
版本的正规库.所以,本文不仅是一篇可视化相关的讨杂谈章,更是提供了一个足以直接追究
golang 标准库间信赖关系的长足梳理工具.

可视化原理

要害涉嫌一下情节:

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

  • 采用原有数据的 ImportPath 而不是
    Name,来作为每个数据节点的唯一id.那样是因为 golang
    本身的包命名规范控制的.

  • 运用原来数据的 Imports
    字段,来确定标准库包与包里面的相互依赖关系.golang是不一致意循环看重的,所以有的循环依赖相关的题材,不必要考虑.

  • 节点的轻重,和包被别的包引入的次数成正相关.这样做,被着重更多的包,图上最后突显时,就会越大.常用包和不常用包,一目通晓.