GoLang调用链可视化go-callvis使用介绍

2023-02-03 09:58:51

本文介绍一款工具 go-callvis,它能够将 Go 代码的调用关系可视化出来,并提供了可交互式的 web 服务。

go get -u github.com/ofabry/go-callvis
在windows系统上并没有自动安装,需要进入下载的目录go install
在linux系统上自动安装了

> go-callvis

go-callvis: visualize call graph of a Go program.

Usage:

  go-callvis [flags] package

  Package should be main package, otherwise -tests flag must be used.

Flags:

  -debug
        Enable verbose log.
  -file string
        output filename - omit to use server mode
  -focus string
        Focus specific package using name or import path. (default "main")
  -format string
        output file format [svg | png | jpg | ...] (default "svg")
  -graphviz
        Use Graphviz's dot program to render images.
  -group string
        Grouping functions by packages and/or types [pkg, type] (separated by comma) (default "pkg")
  -http string
        HTTP service address. (default ":7878")
  -ignore string
        Ignore package paths containing given prefixes (separated by comma)
  -include string
        Include package paths with given prefixes (separated by comma)
  -limit string
        Limit package paths to given prefixes (separated by comma)
  -minlen uint
        Minimum edge length (for wider output). (default 2)
  -nodesep float
        Minimum space between two adjacent nodes in the same rank (for taller output). (default 0.35)
  -nointer
        Omit calls to unexported functions.
  -nostd
        Omit calls to/from packages in standard library.
  -skipbrowser
        Skip opening browser.
  -tags build tags
        a list of build tags to consider satisfied during the build. For more information about build tags, see the description of buil
d constraints in the documentation for the go/build package
  -tests
        Include test code.
  -version
        Show version and exit.

依赖

    Go 1.17+Graphviz (可选,当工具指定了 -graphviz 时需要)

    测试代码

    package main
    import (
    	"log"
    	"net"
    )
    func main() {
    	// Part 1: create a listener
    	l, err := net.Listen("tcp", ":8000")
    	if err != nil {
    		log.Fatalf("Error listener returned: %s", err)
    	}
    	defer l.Close()
    	for {
    		// Part 2: accept new connection
    		c, err := l.Accept()
    		if err != nil {
    			log.Fatalf("Error to accept new connection: %s", err)
    		}
    		// Part 3: create a goroutine that reads and write back data
    		go func() {
    			log.Printf("TCP session open")
    			defer c.Close()
    			for {
    				d := make([]byte, 1024)
    				// Read from TCP buffer
    				_, err := c.Read(d)
    				if err != nil {
    					log.Printf("Error reading TCP session: %s", err)
    					break
    				}
    				log.Printf("reading data from client: %s\n", string(d))
    				// write back data to TCP client
    				_, err = c.Write(d)
    				if err != nil {
    					log.Printf("Error writing TCP session: %s", err)
    					break
    				}
    			}
    		}()
    	}
    }
    

    在linux上可以正常运行,windows上会报错

    > go-callvis main67.go
    2022/09/21 15:28:50 http serving at http://localhost:7878

    go-callvis 默认将代码调用关系存储成 svg 格式的图形。

    在浏览器中访问 http://localhost:7878

    点击上面的 log 模块,将会进入 log 模块的代码调用交互图中

    它主要是作用是清晰的列出了包与包之间的依赖以及调用关系,用来理解项目的大致架构。

    到此这篇关于GoLang调用链可视化go-callvis使用介绍的文章就介绍到这了,更多相关Go callvis内容请搜索易采站长站以前的文章或继续浏览下面的相关文章希望大家以后多多支持易采站长站!