Skip to content
Callgraph analysis and visualization for Go
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.
.gitattributes add preview Jul 14, 2019
.gitignore output html w/ cytoscapejs Jul 14, 2019
LICENSE initial commit Jul 13, 2019
callgraph.png add preview Jul 14, 2019
index.gohtml update, now with signature based colors Jul 14, 2019
main.go update, now with signature based colors Jul 14, 2019


A Go SSA callgraph builder and visualizer, by @protolambda.


  • output to generic Cytoscape JSON format. (list of nodes, list of edges)
  • output to a single html file, with js dependencies in unpkg, and graph data embedded.
  • outputs can be written to program output, or to a file.
  • use different SSA analysis types
  • support for Go-modules (powered by
  • graph data is nested: packages > types / globals > attached functions
  • nodes are colored based on signature (50% parameters blend, 50% results blend)
  • all edges/nodes enhanced with classes to style/filter the graph with
go get

Example output

This is the web output of the callgraph of Gocyto, including unexported functions:

Callgraph of gocyto itself


Provide a Go package pattern to load the packages, and produce the call-graph.



gocyto [options...] <package path(s)>


  -build string
    	Build flags to pass to Go build tool. Separated with spaces
    	Include packages part of the Go root
  -mode string
    	Type of analysis to run. One of: pointer, cha, rta, static (default "pointer")
  -out string
    	Output file, if none is specified, output to std out
    	Consider tests files as entry points for call-graph
    	Include unexported function calls
    	Output an index.html with graph data embedded instead of raw JSON


To easily load packages into a SSA program, and construct callgraphs.

Loading packages:

program, err := analysis.RunAnalysis(withTests, buildFlags, packagePatterns)

Constructing a callgraph:


Supported callgraph analysis types:


Loads call-graph into a Cyto-graph object. After loading your graph (or multiple), the data can be output to JSON to load with cytoscape.

Constructing a cyto graph:

// Base object, manages nodes, edges and keeps track of a [full-name -> ID] map for shorter IDs
cytoGraph := render.NewCytoGraph()

// more options to be decided on later, PRs welcome
opts := &render.RenderOptions{
    IncludeGoRoot: false,
    IncludeUnexported: false,

// add call graph from SSA analysis to cyto graph
err := cytoGraph.LoadCallGraph(callGraph, opts)

// add more call graphs if you like



  • Similar purpose
  • bloated/hacky code
  • uses deprecated SSA package loading
  • no re-usable library code
  • an ugly non-go Graphviz dependency
  • no Go module support.
  • limited styling
  • hacky build-tags support (overwriting the default Go build flags during runtime...)


  • minimal
  • outdated, 4 years old
  • limited callgraph information extracted
  • looks like the origin of godoc callgraph tool (???)


  • digraph and graphviz output support
  • doesn't add extra information (description/classes) to the calls
  • supports same set of analysis algorithms



MIT License, see LICENSE file.

You can’t perform that action at this time.