diff --git a/cmd/godoc/doc.go b/cmd/godoc/doc.go
index d29e807d..88ff2018 100644
--- a/cmd/godoc/doc.go
+++ b/cmd/godoc/doc.go
@@ -43,7 +43,7 @@ The flags are:
-q
arguments are considered search queries: a legal query is a
single identifier (such as ToLower) or a qualified identifier
- (such as math.Sin).
+ (such as math.Sin)
-src
print (exported) source in command-line mode
-tabwidth=4
@@ -80,6 +80,13 @@ The flags are:
HTTP service address (e.g., '127.0.0.1:6060' or just ':6060')
-server=addr
webserver address for command line searches
+ -analysis=type,pointer
+ comma-separated list of analyses to perform
+ "type": display identifier resolution, type info, method sets,
+ 'implements', and static callees
+ "pointer" display channel peers, callers and dynamic callees
+ (significantly slower)
+ See http://golang.org/lib/godoc/analysis/help.html for details.
-templates=""
directory containing alternate template files; if set,
the directory may provide alternative template files
diff --git a/cmd/godoc/main.go b/cmd/godoc/main.go
index fc678afc..6c21e66b 100644
--- a/cmd/godoc/main.go
+++ b/cmd/godoc/main.go
@@ -66,9 +66,7 @@ var (
// file-based index
writeIndex = flag.Bool("write_index", false, "write index to a file; the file name must be specified with -index_files")
- analysisFlag = flag.String("analysis", "", `comma-separated list of analyses to perform.
-"type": display identifier resolution, type info, method sets, 'implements', and static callees.
-"pointer" display channel peers, callers and dynamic callees. (Slower.)`)
+ analysisFlag = flag.String("analysis", "", `comma-separated list of analyses to perform (supported: type, pointer). See http://golang.org/lib/godoc/analysis/help.html`)
// network
httpAddr = flag.String("http", "", "HTTP service address (e.g., '"+defaultAddr+"')")
diff --git a/godoc/server.go b/godoc/server.go
index 8e273c20..76fc48b4 100644
--- a/godoc/server.go
+++ b/godoc/server.go
@@ -506,6 +506,13 @@ func (p *Presentation) serveTextFile(w http.ResponseWriter, r *http.Request, abs
buf.Write(marshalJSON(data))
buf.WriteString(";\n")
+ // TODO(adonovan): indicate whether analysis is
+ // disabled, pending, completed or failed.
+ // For now, display help link only if 'completed'.
+ if links != nil {
+ buf.WriteString("Static analysis features
")
+ }
+
buf.WriteString("
") formatGoSource(&buf, src, links, h, s) buf.WriteString("") diff --git a/godoc/static/analysis/call-eg.png b/godoc/static/analysis/call-eg.png new file mode 100644 index 00000000..c48bf4d9 Binary files /dev/null and b/godoc/static/analysis/call-eg.png differ diff --git a/godoc/static/analysis/call3.png b/godoc/static/analysis/call3.png new file mode 100644 index 00000000..387a38c6 Binary files /dev/null and b/godoc/static/analysis/call3.png differ diff --git a/godoc/static/analysis/callers1.png b/godoc/static/analysis/callers1.png new file mode 100644 index 00000000..80fbc62e Binary files /dev/null and b/godoc/static/analysis/callers1.png differ diff --git a/godoc/static/analysis/callers2.png b/godoc/static/analysis/callers2.png new file mode 100644 index 00000000..59a84edb Binary files /dev/null and b/godoc/static/analysis/callers2.png differ diff --git a/godoc/static/analysis/chan1.png b/godoc/static/analysis/chan1.png new file mode 100644 index 00000000..5eb28111 Binary files /dev/null and b/godoc/static/analysis/chan1.png differ diff --git a/godoc/static/analysis/chan2a.png b/godoc/static/analysis/chan2a.png new file mode 100644 index 00000000..b7575041 Binary files /dev/null and b/godoc/static/analysis/chan2a.png differ diff --git a/godoc/static/analysis/chan2b.png b/godoc/static/analysis/chan2b.png new file mode 100644 index 00000000..d197862d Binary files /dev/null and b/godoc/static/analysis/chan2b.png differ diff --git a/godoc/static/analysis/error1.png b/godoc/static/analysis/error1.png new file mode 100644 index 00000000..69550b9d Binary files /dev/null and b/godoc/static/analysis/error1.png differ diff --git a/godoc/static/analysis/help.html b/godoc/static/analysis/help.html new file mode 100644 index 00000000..29f89852 --- /dev/null +++ b/godoc/static/analysis/help.html @@ -0,0 +1,270 @@ + + + + + + +
+ When invoked with the -analysis
flag, godoc performs
+ static analysis on the Go packages it indexes and displays the
+ results in the source and package views. This document provides a
+ brief tour of these features.
+
+ The current status of the analysis features is that of a technology + preview; there are many problems and user-interface difficulties + which will be addressed in due course. Some known problems are + mentioned in passing, accompanied by a warning triangle, ⚠. + + Nonetheless, godoc's static analysis may be immediately useful today + for small-to-medium sized Go corpora, and it contains several + advances over the state of the art in code browsing. +
+ +
+ godoc -analysis=type
performs static checking similar
+ to that done by a compiler: it detects ill-formed programs, resolves
+ each identifier to the entity it denotes, computes the type of each
+ expression and the method set of each type, and determines which
+ types are assignable to each interface type.
+
+ Type analysis is relatively quick, requiring just a few seconds for
+ the >200 packages of the standard library, for example.
+
+ If any source file contains a compilation error, the source view + will highlight the errant location in red. Hovering over it + displays the error message. +
++ ⚠ The mark-up for compilation errors may + cause duplication of portions of the input. +
+ +
+ In the source view, every referring identifier is annotated with
+ information about the language entity it refers to: a package,
+ constant, variable, type, function or statement label.
+
+ Hovering over the identifier reveals the entity's kind and type
+ (e.g. var x int
or func f
+ func(int) string
).
+
+ Clicking the link takes you to the entity's definition. +
+
+ Clicking on the identifier that defines a named type causes a panel
+ to appear, displaying information about the named type, including
+ its size and alignment in bytes, its method set, and its
+ implements relation: the set of types T that are assignable to
+ or from this type U where at least one of T or U is an interface.
+
+ This example shows information about net/rpc.methodType
.
+
+ The method set includes not only the declared methods of the type,
+ but also any methods "promoted" from anonymous fields of structs,
+ such as sync.Mutex
in this example.
+
+ In addition, the receiver type is displayed as *T
or
+ T
depending on whether it requires the address or just
+ a copy of the receiver value.
+
+ The method set and implements relation are also available + via the package view. +
+
+ godoc -analysis=pointer
performs a precise
+ whole-program pointer analysis. In other words, it
+ approximates the set of memory locations to which each
+ reference—not just vars of kind *T
, but also
+ []T
, func
, map
,
+ chan
, and interface
—may refer. This
+ information reveals the possible destinations of each dynamic call
+ (via a func
variable or interface method), and the
+ relationship between send and receive operations on the same
+ channel.
+
+ ⚠ Pointer analysis is currently quite slow, + taking around two minutes for the standard library. This will + improve markedly with the planned addition of a constraint + optimizer. +
+ +
+ When pointer analysis is complete, the source view annotates the
+ code with callers and callees information: callers
+ information is associated with the func
keyword that
+ declares a function, and callees information is associated with the
+ open paren '(
' of
+ a function call.
+
+ In this example, hovering over the declaration of the
+ rot13
function (defined in in strings/strings.test.go)
+ reveals that it is called in exactly one place.
+
+ Clicking the link navigates to the sole caller. (If there were + multiple callers, a list of choices would be displayed first.) +
+
+ Notice that hovering over this call reveals that there are 19
+ possible callees at this site, of which our rot13
+ function was just one: this is a dynamic call through a variable of
+ type func(rune) rune
.
+
+ Clicking on the call brings up the list of all 19 potential callees,
+ shown truncated. Many of them are anonymous functions.
+
+ Pointer analysis gives a very precise approximation of the call
+ graph compared to type-based techniques.
+
+ As a case in point, the next example shows the dynamic call inside
+ the testing
package responsible for calling all
+ user-defined functions named ExampleXYZ
.
+
+ Recall that all such functions have type func()
,
+ i.e. no arguments and no results. A type-based approximation could
+ only conclude that this call might dispatch to any function matching
+ that type—and these are very numerous in most
+ programs—but pointer analysis can track the flow of specific
+ func
values through the testing package.
+
+ As an indication of its precision, the result contains only
+ functions whose name starts with Example
.
+
+ The same call graph information is presented in a very different way + in the package view. For each package, an interactive tree view + allows exploration of the call graph as it relates to just that + package; all functions from other packages are elided. + + The roots of the tree are the external entry points of the package: + not only its exported functions, but also any unexported or + anonymous functions that are called (dynamically) from outside the + package. +
+
+ This example shows the entry points of the
+ path/filepath
package, with the call graph for
+ Glob
expanded several levels
+
+ Notice that the nodes for Glob and Join appear multiple times: the + tree is a partial unrolling of a cyclic graph; the full unrolling + is in general infinite. +
+
+ For each function documented in the package view, another
+ interactive tree view allows exploration of the same graph starting
+ at that function.
+
+ This is a portion of the internal graph of
+ net/http.ListenAndServe
.
+
+ Because concurrent Go programs use channels to pass not just values + but also control between different goroutines, it is natural when + reading Go code to want to navigate from a channel send to the + corresponding receive so as to understand the sequence of events. +
++ Godoc annotates every channel operation—make, send, range, + receive, close—with a link to a panel displaying information + about other operations that might alias the same channel. +
+
+ This example, from the tests of net/http
, shows a send
+ operation on a chan bool
.
+
+ Clicking on the <-
send operator reveals that this
+ channel is made at a unique location (line 332) and that there are
+ three receive operations that might read this value.
+
+ It hardly needs pointing out that some channel element types are
+ very widely used (e.g. struct{}, bool, int, interface{}) and that a
+ typical Go program might contain dozens of receive operations on a
+ value of type chan bool
; yet the pointer analysis is
+ able to distinguish operations on channels at a much finer precision
+ than based on their type alone.
+
+ Notice also that the send occurs in a different (anonymous) function
+ from the outer one containing the make
and the receive
+ operations.
+
+ Here's another example of send on a different chan
+ bool
, also in package net/http
:
+
+ The analysis finds just one receive operation that might receive + from this channel, in the test for this feature. +
+
+ ⚠ There is no UI indication of the state of
+ the analysis (pending, complete, failed) during warm-up.
+
+ ⚠ All analysis results pertain to exactly
+ one configuration (e.g. amd64 linux). Files that are conditionally
+ compiled based on different platforms or build tags are not visible
+ to the analysis.
+
+ ⚠ Files that import "C"
require
+ preprocessing by the cgo tool. The file offsets after preprocessing
+ do not align with the unpreprocessed file, so markup is misaligned.
+
+ ⚠ Files are not periodically re-analyzed.
+ If the files change underneath the running server, the displayed
+ markup is misaligned.
+
+ ⚠ Additional issues are listed at go.tools/godoc/analysis/README.
+
*,\xde\xdbIm\x11\xbe\xder\xa0(\xe7e\x91\x9f\x1c\xea\xec\xec\x9c\xfflg\xe75\xf1\xb5N\xf7\xb3\x9dC\xbf|\xd6\xdd\xf9\x9axn~GG\xe7\xeb\xcc\x1d\xf9c\xdc\u007f\x90t\xea\xea\x98_t\xa0c\xa3 \xff&@\x05i7^\x060R\x9c\xd4\xc9 T\x99\x96\xb3K\xa7D9>\x19\xc42\x8b\x91\xf3\x95\x87聥%[\xf0\xb4\b\xc2jqh_Q\x96w\xed\x81\"\xf7Jv\x86\xf7L\xb6w\xedk\xacNh\xf2\x97\x82\xcc\x01\xf1;\xf4\xd1\xfd+\xf61\xd4w\xc4N7+s/\xbf(\xdfd\xf4\xf7\u007f\xf3\xdf$\x9d\x06_.\xf7f/\x97\xef\xf0kN\n\xfbM\x02`#\x8e\xea\x04\xac\x93\xb5SoR\x8f?x\x9e\xfdû\xef^\xfb\xe5\xea\x9ck\xf2-\xb0\u007f\xf7W\xb2N\xa1*\xdb]\x05\xdaϖ\x81\x9d@\xa78'z\x9d\x8e(?\xe89\xb4\xb8C\xd6\xe9G\xffE\xa3S_:n(\x1f]\xa0S\x9c\x13\xbdN\xe7\xd8\x109\xe5\xa2\xf0+\xe5\\0\xec\xe8\x04F\x19\xe8\x14\u05fc.\x8d4h'\xf5\x19z\xc6\xf3lKG˳\x9e\xf5C\xd0i\x8c\x80Nq\x8d4\xd2\xf0\x9avҀ\xa1#Ox\xdd\xde'\x8e\f\x05\xbe\x8d\xfb\xb7\xd0\xc9a\xa0S\"\x02\x9d\xc6\b蔈@\xa71\x02:%0u\xd0\xc9a\xa0S\xc22\xb8a!\xbb\x05v\xc5!\xf8\xe4\x18\xd0)a\x99\xa3|A㳻\xe0\x93S@\xa7De\x80}}\xf0C\xbf\xff\xde}\v\x13\xe5v\xc8\xf8\a:%*\x03\x84dfޗ\x969{\xd2\xc3\xd0\xc9)\xa0S\xa22\xb8\xe7s\x9f\x9dt\u007fJJJf;\xc2V\x9c\x02:%,3\xa6\x97U\x1f\xba\xd0\xd5\xf5\x12\xbe/\xe8\x18\x8e\xea\xa4\x1b\xaa
?\xe9\xfe\xaf\xbd\xcdM<\xff\xe5\xcfMz\xf0\xbb\xd0\xc9\x00\xe8\x94\xc0\xf4\x9e\xd0~\x80\x1c\xae\xd3\xfd\x8aM\x9f\xfbޫ\xcfS\xb5\x1e|\xee\xd5_\u007f\xe5+\x01\x9d\xfe\xf5\xc1\u007f\xa5\a\xb0\xafq\x13\x0f~\xf3\u05ef\xfe\xec\xcb\xd0\xc9\x00\xe84\xa1\xe0u\x92O\xf6\x94S\xba/|\xf7\xed \xbf\xbe?\xa0\xd3\x17\u007f\xa6\x18\x17\x9c\xf8\xec\xcf\xe5:\xd0I\x17\xe84\xa1\xe0ubC\x11\xf7\u007fK\xd1iү\xe5\xff\u007fNO\xe6&M\n\xe8t\x9f|C\x117\xf1\xd5\xfb\xbe\xf2\xad\x9fC'#\xa0ӄ\x82\xd7I\xe2\xb9\xcf\xcb\xffߧ\xe8\xf4ů\xfe\xfc\xedW\x83:MR\x8eE\xa1\x89\xb7\u007f\xf6\xb5/\xdf\xf7M\xe8d\x00t\x9aP\x84\xe9\xf4\xe5\xaf)\x1a)'{\x9f}\x95^(\x05u\xfa\xc27\x95j\xc1\t\xc6\xf3\xf7A'\x03\xa0ӄ\x82\xd7\xe9K?{\xf5\xf9\xaf|\xe1UY\x91\xe7\xeeW\x86\"\xbe\xf9\xea\xcf>\x1f\xd4\xe9\xb9\xfb\xbe\xf5\xebW\x9f\xfb\x127\xf1\xa5\xef\xbd\xfa\xea7\x1f\x84N\x06@\xa7\t\x05\x13I\xb9\nz\xfb\xbb\x9f\xff\xcc\xfd_}5p\xc8\xf9\xee祁\xf2\x9f=8\xe9\xfeo\x06uz\xfb\xb9/~v\xd2\x17\x9f\xe3&\xbe\xf7\xc5I\xf7}\xf9y\xe8d\x00t\x9aPp\xa7y#\x03:\xe9\x02\x9d&\x14\xd0it\x81N\x13\n\xe84\xba@\xa7\t\x05t\x1a]\xa0ӄ\x02:\x8d.\xd0iB\xa1\x1f\xa3\x12\vfs\x9a\x988\xaa\x93n\xa82\xe5\xcc\xfe\x9a\xba\xf6\b\xed\x80Bİf\xdb9A\xf6\x9bU\x01j\x9c\xd4I?TY\x1cl\xacj\xbb\xd0^\xa5\x97\xb3\r\xd4D\fk\xb6\x1d\xc42[\xc6I\x9d\xf4C\x95\xc5\xc6\xean\xa6\x9a\xf6;v \x12\xbaa\xcd6\x83\x1cY\xcb8\xa9\x93~\xa8rw\x95\xf4\xad\xdcQ\xde5\x12\r\xdd\f\n\x9b\x81N\x96qT'Q/T\xb9\xad:\x91~\x8af\x141\vk\xbe\xe8\x16\x84\xad\xbfY[8\xff\x89w\xb9RӰf\xcao\xca\x17\xbb\xbdO\xbd.j@,\xb3e\x9c\xd5I/TyO\xfd\x99]U\xb5\x87\x12*\x04vt0\tk\xbe\xdeҒ_\x94\xedݸv.\x9fBa\x1a\xd6,\x8a\x1d\x9e\xaf\xef\xed\xd8)\xecS\x15\x1a\xc52\x83H8\xab\x93^\xa8r\x9d\x14\xaa\\[\x87cT\x14D\x0e\x1c\x13\x1f\x15J\xae\x89C\xea\xf8>Ӱ\xe6\xeb\xf9O\xb0\x9c\xb2\x16u3\xa3Xf\x10\t\x87u\x12\xc3C\x95\xeb\xa5\xf1\x88\xfe\xc4\nU\x1e-\xcct\xca\n\x8bG2\x0fk\xee\x10~\xa5m$\x1a\xc72\x83H8\xa9\x93~\xa8r\x93<\xf6۴Ǩ\x19\ba\xa6\xd3\xd7\xc3\xcbLÚ\xf7\t\xd7\xc3[I-q\xedd\x15'u\xd2\x0fUn\xaf\x91>\x8clęE\x14\x98\xe9T\xaeShF\x87:+=\x04F\xf6,\xe3\xa8N\xba\xa1\xca}\xd2@y\u007f5n\x8b\x88\x82\xd1\xd0\xe9\x9aw\xe5\x10\xfdo\xe3F\xed\x1f\xa0\x93e\x9c\xd4I?TYl\xafn\xef>U\xbb\vC\x11&\x98\x855\xbf\xfb\x8b\u03a2\x95\x9d\x9d\x16\xc3e)\x1d\xf3\x8b\x0etl\x14\x0eh\xcbuc\x99A$\x9c\xd4\xc9 TY\xec\xdaS\xb3\xab\x1d6\x99a\x16\xd6|Q\x90xʠy\x04^.\xf7f/?\x12V\xac\x1b\xcb\f\"\xe1\xa8N`|\xa1\x17\xcb\f\"\x01\x9d@\x04\xc2c\x99A$\xa0\x13\x00\xb6\x01\x9d\x00\xb0\r\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\t\x00ۀN\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6\x01\x9d\x00\xb0\r\xe8\x04\x80m@'\x00l\xc3Q\x9d\xf4B\x95\ak\xabdjM\x1a\x83\xf8\x80\vv\x06Z\x9c\xd4I7Ty\xa0\xaa\xbd\x9b\xd2^u¬9\x183\x9a\xb8\xafJs\xc1\xce@\x8b\x93:\xe9\x87*\x9fbv\r\xd4⋟q\xcc\xecEf5\x80\x84\x93:\xe9\x87*K\xd4\xe3\xbb\xed\xf1L\x06t\x8a\x0eGu\x12\xf5B\x95\x19R\x12\v\x18+\xba\x16\xa6\xba\xd2\xe6I_\x14ܐ\x91\x94\xb1\x81\xfe_L\\UKg$=\xc4\xde\xfa\x94p\xbe\f\x91\x0fv\xe6*\x14\xb3\xa2\v.2S\xea\xacv\xce\xd4\x19K'j@\x9f\xb3:\xe9\x85*3\xa4$K0F4Mͨh,#\x15t\xb2\xc0\xb5\xaa~\x95+\x97\xbe\xc1\xd5N!\xa9e\x15\xc9\vE\xb1\xffP\xf3\x8c\xcc\xe6\xe6f)\x99\"\x18\xec\xccU薊\xda\n\\\xac\xbc`rq\xfd\xbaԌ\t\x1a1\xe1\xacNz\xa1ʔ\vU\xf8\n\xf5\xd810m\xde\x00\xcbk\xa3W\xb3\xfb\xa5\x1fH\x93\x1f])\xf4E\xc9M\x95\xaa\xa8N\xf6\x02\xe1d\\\x05ɰ2\xa6S=\xa9\x11Y\xa4\xd8vqB\xe2\xb0Nbx\xa82\xa5\xb1.r\x130\x9aԓ@\xa4\x94X0K\xfaof\x01}p\xb1\aI\x11#\x9dB\x15B:-\x9a>\xc8H/\x10'$N\xea\xa4\x1f\xaaL\xa9Ad\xe5\x18\xb2\x8e\x04\u007f\xbdd\xce\x02\xe9\xbfy\xb3E^\x11#\x9dB\x15B\x93\x19ʅ\xd6\x04\r@rR'\xfdPe\x96\x03\xab\x8a\xa0\a\xce\xd2\xc8\x1d\x9d\xa6K\xffM\x97\x8eNZ\x9d\xaa_\x92+\x19鴊M\xe6No\x97\x98\xa0CK\x8e\xea\xa4\x1b\xaa\xcc.\x9dF\xf77^AD\xfa\xd33ٛ[\xf1Rv\xdeǮy\xb6K\x81ͼN\x99\x99\xf4\xb2\x97(\xa7\xe4::%\xad\x10\xc5\x1b\xb3\xd9\xe4~\xb9\xd6\xe3k\xc4\t\x89\x93:\x19\x84*S\xb7\xf0[icI\xd3\x0337\xd4\x17\x13vҐ;yE\xfd\x8aɹ\xd2h]A\x9b\xd8^\xe0\x92~\x93\xad\xccU\xb1'sj7\x1f쬪0'u͚9dJ\xcd\x19Q\\A\x16\xd5\xed) \x13\xf4\x961'u2\nU\xbe\x80\xbbVƖ\xaeE\xe9ɳ\xe5\x17aݬ\xa4Y\xf2\xe7N\x84\xb8NM\xa5\x8f\xc5\xf4\xd9@qJR&\x8bD\x0f\x05;\xab*te&%?\xf4\xb8\\w\u007ffjʜ\xfdF\xb3Jp\x1c\xd5\t\x80\xc4\x06:\x01`\x1b\xd0\t\x00ۀN\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6\x01\x9d\x00\xb0\r\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\t\x00ۀN\x00\xd8\x06t\x1a7,\"\xa9\xb9g\xcc*\x811\x05:\x8d\x1b\xba\x9bjf\xa6NԈ\xa0q\x82\xa3:\xe9\x85*\xb3\xa4\x9c]ջ\x0ea?\x89\x82&\x82\xacܸ\xc6I\x9dtC\x95ž\xda]R)\xbe\x91kN\x1bi3\xab\x02\xc6\x12'u\xd2\x0fUn\xaec_\xad\x1e\xack6i\r\xa0S\xdc\xe3\xa4N\xfa\xa1ʍr8\xd8\x1e$W\x9a\x03\x9d\xe2\x1cGu\x12\xf5B\x95\xfbj\x9b\xfa\x06\xfb\x9aq\xb2\x17\x05'H\x93Y\x150\x968\xab\x93n\xa8\xf2@#-ݏ\xf4\x95(\x18L\x9d}\xa8{\x82\xe6\x15\x8f\v\x9c\xd5I/Ty\xb0\xb1\x8e\xe5\x1b5\xe2'4\xa2`?!d\x81Y%0f8\xac\x93\x18\x1e\xaa\xdc\\7 \x95\xe2\a\x9e\xcc\xe9O\x9d\xbe\xae\t\x19\x9f\xf1\x8b\x93:\xe9\x87*W\xcb\xf9`R6,\x88L\x1b\xc1\x80M\\\xe3\xa4N\xfa\xa1\xca\xd0)z0\xb2\x17\xe78\xaa\x93n\xa8r\x93t\xb27P\x871+s\xa0S\x9c\xe3\xa4N\xfa\xa1\xca\x03\xdb\xebNu\x9f\xaaێ\xa1=s\xa0S\x9c\xe3\xa4N\x06\xa1ʃm\xbbjv\xb5a`ό\xc1\xee\xf6E.\xfc\xae\\\\\xe3\xa8N`$,$d\xda\x1e\xb3J`L\x81N\xe3\x86\xee\xe384\xc5;\xd0\t\x00ۀN\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6\x01\x9d\x00\xb0\r\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\t\x00ۀN@\xcd\xe0\xc0\xc0\xc0`\xf0?`\t\xe8\x04T\x1c\x9aL\bI\xea\xefO\xa2\xffMFX\x9bE\xa0\x13\x90\xd83\xa7W\xfa\xbf\x8eԷ\xb5\x9d\x12\xc5Smm\xf5\xa4Τ\xd1X\xd37'\xce\xee\tvT'\xfdPen\x12\x18\xf3\x1dAh1\xab\x13\x99\rd\xf2v\xa3\xbfU\x902y\xa2\x8e\x04o\xb4\xed\x96u*&\x93G[\xab\x98\u05edb\xf2\x1a\xb3*\x8e\xe2\xa4N\xfa\xa1\xca\xfc$0\xe6\xf5N\xf7N\xb3:\x91\xe9k\x9e]f\xf0\xa7u\x93k\x94\xa9p\x9d\xba\x9b]\xfa͚l{\xcd\f\u05ed\xe3\x9cnq\x88\xfa)\xebLj8\x8a\x93:\xe9\x87*s\x93 \"Y#\xd4I\x14\x17\x18\xe8t\xc1\xb5\"0\x19\xae\x93(\x1a\xe84{\x91nqL\x18\xac\xdb\xf2r\xddb\x8eUq\xf5\x8dJ'u\xd2\x0fU\xe6&ADFO\xa7\x82\xf4\xe0\x9b\x99\x05\x9d2F_\xa7GMu\xeaO/0\xab\xe2 \x8e\xea$\xea\x85*s\x93 \"Y\x1b\x9f\xf1\xe6<\xf5\x1bUYw2\x91I\xe6ޤ\a\xd3\\\x8f\xa7\xa77\x15\xa7d\xb2\x84\xd0E\xe9\xaei\v\xe4\x1f\xb2\xa1:\x15Ӻ\x0f\xb0Q\x87\xda9Sg,\x95-\x1aL\x0e\x1e\x9c\xf4u*~8=eA\x17}룍\x1f\x17\xcb\xe8c]\xbd2\xdf\f\xa9\x06\xd7Y8\xef湷z\xbd\x1d\x1bsV^\x13\xc5k\xe5^w\xfeS\x17i\xf1E\xb7 <5\xe4\x15\x84\x9c\xebܺ\x1d\x11\x04a\xab\xb8\x93>\xb6\xb0I\xc6\xd7Y'C?]\xee)\xdax\x9dMv>\x91\xef^\xfcT\xfe\x90\xdc\xfb\xaa\xa48J\x19qV'\xbdPe>_\x19D\"K\xf8zK\xcb\x12\xcfE\xbel\xb0f\x9dL\r\xff!QS2Y\x9aIRפU0\x05\x1en\xaa[0Y\xcal\xa1:u\xe7N^Ǧ\v&\x17\u05efK͐\x12\x9a۹\xe8s]\x9dH\xc6\xf6\xed\x19I\xa7\xc4\xfeCӊ{\xc5\u07b2\xe4\xe6\xfe\xfeC\xcd32\x9b\x9b\x9b\xa51$\xbe3\x1d:\xb2\x85\x8d%\xc2\xe2\x9dy\xfb\x98.\xeb;Z\x9e\x12\xe85\xd1\xd0/v\n\xbf\x10\u007f:\xf7\xa7\xbf\x12\xb9u\xbbޙ\xff\xec\x1f\xc4?\xfc \xbb\xf3ڵ\xce\u03a2\x95\x9d\x9d\x9d/\xb3>\x9e\x116v\xec\xf3>J\x1d\xfa\xe5\xdcgZ:\x0e,\x16ޕ;?\x14Oq4\xce\xea\xa4\x17\xaa\xccM\x82\x88d\x15\xd17\xe7\xebE\xcbU\x85\xbd\x17dzU\xa5\xe9\xb9T\xa3z\xb1\xe0a\x16\xb9\xc6\u07bff-d\xc5T\xa7\n\x97t\x1aPO\xd8\xd8C\x1b\xd9.?\t%\xcb\xea\xea4\x93\x1e\x00\x06f̡\x93e\xechT \x9f_\x05O\xf6T\x9d\xe9\xe1]+v\bG\xc4g\xd6\xd3\xe5o\xa1\x87\xa8\xa1%\xabY\xf1\xd03˯y\xe5\xb3 \xcfsS\xdb\xe7\xf4L\xf7\xe9\x99\xd3Ӄ6\r\xcc\xfc>\u007f̜9\xfd;\xa7\xcf\xe9\x9e\xfe\xce\xe9\xd3=\xfd\x1d\xf3\xeb+\x80\x00\x00\x00h\xc6h\xa9\x867\xb4*\a\x00 \xc0\x00E\x01\x00@?@Q\x00\x00\xd0\x0fP\x14\x00\x00\xf4\x03\x14\x05\x00\x00\xfd\x00E\x01\x00@?@Q\x00\x00\xd0\x0fP\x14\x00\x00\xf4\x03\x14\x05xE\xfa\xb5\x02\x80@\x02\x14\x05x\x15Z\xe2\xa7poi\x05\x01\x01\x04(\xca\b\xe6PD\xabV\x881\xb4E\x1cb/\xe8\x9f=\xdb^\xde\xc4^\x06\x04$\x06)ʱzW\xaa\xfe\xf0\xee\xfc\xf38\xd1Q\x95o?t\xa9\xc7-\xa9\xc6\xdfv,\x89I\xee\xf3\x16\xe1A\xe1XNd\xec\x01\xadPL\xdd\xfc\xd0)\x8b\x8fM\xb9\x87\xe2\x85\"\xa1\u05f5\xc2\tG9.\xa2\x1f\x1d\x10\n|\xa3\x1eT>\xb9ȕl]1%dA\xbf{\xae\x1a\x9b\xb9\x8dZ!/AM\xdc\x19\xad\x10\xc2i\x13/b:!4%\xe8\vf\xd0%\xee03\x1f\bX\x8cQ\x94{\xd9߉\x89\x9er\xfb\xa9\xa6\x8b\xd97\x10j\xcf=T\xd7t~wa\x8f\"\xa9\xca'q_\xa7\x9b\x9fx\t\xf0d3WU\x95\xc9m\xad\xaa\xe26\xab\xc6\x1c\xbd\xe8J\x1d\t\x8d\xb0\xef\x9f\xc3q\xf5\xe8\x16.vJ\xb5\bMW9\x17R\x85:\x0ep\xe5]\xca\x05r\xbd\b\x95\x84J\x8a\xf6\xe6\x94\xcc\xf8\x906\xf7\\\x152\x83v\x8b\t\xba2&\xb5\xd7\x06\x11p\xd6|B=\x90\xe2 \xefp\x94\xf2\xc5\x0eǼ\x83§\x92\xb1\xdbYA\xdfq\xc7Y\xd9@\xe0b\x88\xa2\xb4\xe4\xbb\x14\xa5\xdc\xde\"\xfcRg\v#\x96o\xf2\xf1ou\x9b\xfd\xbc\"\xa9\xc6c\xbe\x14\xf5u\xaa/g\xb1u*\n\xea\xe0\x96\xc6#\xd4\xc4u\xb8\xe5K\xf5b\xa4\xa9\xcb6n;\xeaw\x85jMh\xde\x18\xbf֙RT&\xd3\x1a\xe9:'Z\x9d\xca\f\x90Q\x04\xf88\xd2+6!\xd4\xc0_E\xc8\\\x8c?\xae\x0f\xbe\xc5\b\xf2yC\x01\x81\x82\x11\x8ar,\xfb\x98]T\x94\x96\xec\xef\xf1\x1b\xfe\x95.\xcc'9G\x8b\x14I5\xee\xf2\xbe\r\xd5i\xban8\xbf\xf17\xdc\x06\x10\x14\xe1\xef8\x13kC\xee\xe1\xb7-\u070f\xf8\xcd\xe7\x03\xa5\x83\xfbf\xc2S\x86\xa2H\xf5*\xb8\xcei\x9e\xe9\xc8\xc4OuUʮ\f\xd5qu\xce\xd4J-E\xd1\f`\xd0}ש(w\xbb\xf1ǎ\xa9\xf1\x8c \x9f7\x14\x10(\x18\xa1(]OQ\x9e\xa8(\xa7\xec=\xae\xdf\xe6\x96;\xe4\xed\xe4\x01E\x92Io\xacxB\xbf\v\xa1\x9d|T%\xbao\xe2\x97㤩lW\x82y\xc3\x03\x12s75\xd6\x14\x97\xfc\xc0\xbd\xa8\xfc\x8dϋ\b\x9d\xb5\x8a\x1c\xa3\xc7\xe7O\x1f\x17\xb6`\x06BE\xcey\x96p!s\xa6x\xbc\xb4n\xe9R\x16\xcb\f\x0f\x9d\x93\x89\x14\xc5\xe8\xca:\xb8\xa6\xf0|\x97\xa2\xb8b\xe9z\xdbB8.h/^\xda\x13&\xe6\xaeR\xe4R\x95]\x1a\xcbq\xeb\xaf/\x9d\x112\x1f\x9f\xfe\xf5L\xfc\x98,\xa5+\xa3\xd8>\xab\xa8\x9e\xab/\x99\x95\x89\xce8\xa7;V\xe3쁊Ds®\xe78yy\x83\xcd\x14\x9bl\x1bP\x04<1\xf3x\v\"\xb7\xcd\xf78=֖\x93\x13k\xaeV\xaeDT\x14'\xebC\x18\xc2|\f\x14\x05Pb\x84\xa2\b8\x15\xe5PQ}\xa1}\xefI\xf9\xabٿ\xb7\x8a\x91t禣\x92/p8~F\xe8\x81\xc3T\x80\x06\xaen\x8bF\xa8\xb9\xd2\xc4\xc7\x15\xfc\xd9\xf2\x19\x8e\xa85\xaf\xfe\xaa\xa6\x80/v/)IC|\xd0\a%\xdb'\x87\xf7\xe3S\xff\xf8\x03\xe5\xf60\xae\au\x9c\xac\x9a5\xb7\xaa\xaaJ8\xd1\xe9\nR\x9c\x19\xc9łח\xac\x0f\xfe=\xa2\x8bѕ\t\x8a\xb2}\x81SQ\xa4X\xaa^\x84\xceWU\x05o\"u}_\xb5\x9f\xdbTUբ̕+\xeb\xca\xdf;c\xd6\xc4髖r\xf8\xe2\xc9E\xee\x18Y\xac\xa8L\xa6e)\xf7\x06\xf7[n\xf1\x1d\xd4yő\x90\xe4p8n\xe3쌨\xacs\xa5q+\x85\x13\x9b\x9f楟\xa8)\x8b\xe5_(\x03\x1a\x1c\x8e\x98\x02\x9c\xa07_\xefrk\xe9\xbe\x18s\xd9\x06\xf7\xedG+\xcaI\x0f\xf1\xe8\xb9w\xecw\x93\xdcGg@\x80c\xac\xa2\xe4\xdb\xf3.ݪߛ/\xcd\xc1\x9e\xccmc$=\x91\xcfz\xa2\xf1\xf1P\x10M\x92\x16\xe1\a6=NHuے\x85\xa1yo\xf5c\xf7r.i(\xe2rɧ\xfd\xc2Hb2^{\xe6$2Vr\x9dP4q\x87X\xc5\x0esG\x84\xd7#\xf8\x82\x06U\x8c\xaaLP\x94{\xaf\xdf#\x8aBź\x9d\xa8\x848\xb5Cy\xd6\xe3̥*\x13\x8aqo\xb6\x89'\x85\xa8\x84\xbb\xe1\x8ad\x9f\xf5\x1c\x1eǍs^h\x91Nj\xce\xf2\x15\b\xeb\x800\n)\x8d{!$K-}\x8a\x00\x8c\xa8(\xf4\xe6\xab\xe6\x1b\x85P\xbe\x19\xb9C+\xca-\xce}\f\xf9\x960t\x1a\xc4i\x1c\x10\x10\x18\xab(E\xf6v\xe1\xb5#\xf7[g\xf6\xa9l\xe9^\x06*ɀ\xad(\xe9\xae\xe4\x05\xfe&\xbb\x9cK\x1a\x16\xcf\xec\xc1L\x13\xcem\xeeL\x9d\xb1\xc2\xfe}\xbf(j\xae\x83\xb5g,s\x8c\x12\xff[\xf2\xf6\x86\xb2\x18U\x99\xa0(h\xc1V\xa2(T\xec`\x14\x85\xaaL(\x16,m\x84BNJ\xb2\x14\xa5m\xd5\xf8i\xdc\xd4\xe0\x8f\xc8\xe4\xac$\x18i\xef\xf6\xbe\x10\xb0e \xf4к,\xab\xecf_/R\x04`$E\x916_\x8eEx\xb9͟F\xee(\x15e\xbf\xdbҦ\xc3ٳ\xc3`\x8c\x02(0VQ\x8e\x15\x8ao\x87\xc8[\xcfQ\xbbk,O%\x99\xb0\x15EJ\x16\xf3\xdd\xecr.i\x98㜍\xc0\xb7w\xb6e\xbf3\x9b\x9b\"^Q\x96\x0eV\xe7 O[\xf7\x8027}r9q\xdb\xd5\xde\xcedk\xed#ڰT\xe0Ǡ-b\xc1\xa3\xaf\xbf\x91Y\xf2\x01g\xc7\xf7\xc1ƟB\x17\xe3\xc7U\xb5\xa0M\xdc;\x99\x9f\x87sa\x9bOѹ4\xc1\xdc\xfcS\xdfDL\xc2\x1aG\xf5MN\xde\xc1\xf7\xccnu\x19\xaf.\xe4&xl\xfe{UU\x13\x16;\xedZ\xc1\x13\x15\xf0\r#\x14Eӥ\x14\xdf\xfa&\xb0\xd7[%C\xc1\xc9\xf1xfd\xdc\\<\x91ҟ9'tN\xa6x\xf4t}\x10\x162\xf7[\x84\U0008595b\x05]\x99\x15\x86\u007f\xd3]\x86\xa5\xc2\xf0*~zț\xe7=\x15%wr\xb6{\x96D\xdf\x12\x9e\xaf\xb4\xf0\xe6j lɃ\x1e\x97&\xbfk\xe1?\x14R\x8dQ\xdd\xcf+\x9e\xbc\x88nD\xbd&\xe6\x18%\xe3}\xf2\xb6|\x9b\xa2\x86\xb4w{_\b\xd82\x14\xab\xa8\x88^T1 &o\x9f\x11\xb9\x8d\x94Њ\x12\xdc\xe4LɊ\xb2xf\x0ffZ<\x02\f\xa0}L\x9e\xa0(\xbf\xe6\xbd6\xb7\xa9\a\xf93\xc6*\n\xe5R\xda%\x8e\xb6/\xd9\xfb\x9d\x16\x83\xe8\xd07̢\xa3\x91'e\xa9\t\xfc\x92\x83\xc2!\xdf\x10g\xcb9\xedX\x87\x15\xa5\xdb\xd4X\xcc\xef\xbb\x1d%\x9c\x9d8\xe7QzkțKQ\x12S\xc8[r\xa2\xa2\x86\x0f\x9dC\x90\x14\xe5*\xeen\xe0\x13\x9b\x917hE\tw\xa5dE\x99\xe3\x9ciy\x8bQ\x14Н\xf61\xbb\xff\x03KJ\xe6\x98\xf9\xfe-)\xc6*\x8a\xecRڟ'\xce\xc3~/(J}6\x1e\xb9\xb4e\xfb͵\x9e\x86\x1cA\t\x9eTƔ\"\x94\x90\x88\xa7TS\xb1\xa2\xa0\x84\xcauk\x12N\xe3s\x9f\x9c\x98_pF5\xff\x88\x84\xbb\xc6(\uf489\xd8e\xe9\x8a\x1a\xd2\u07bdFx\xec\xb6\x12j&\x85\rQ\x14;\x19\x9c\x84\xbf\xed\xca$\x8a\xb2\x1e+\xcaҙ\x17\t\xad*\xc5\x01]i\x1f\x93K\x14\xe5\xd7/Ƽu˟%\xc5XE\xa1\\J\xf7\x1e\xc1\x19䬧\x9f\x18\x94\x1e\xf5\x9f\xfbQ\n\xf0T\bBI;\x10\xb2\xa5\n\x89\xbe\x95DQҲL\x17\xf8\x9d8\xe3\xb1\xe53ᄦ/i\x19\tw)\xca92WRɟS\xd4P\xc3W\xe3d\xceA\x8f\xd5t\ue2b2\xd6x\xe4JDF\"t\x8f\xcb\xc7Iy\xb8\x12\xfa\xb1\xb0\xbd#\xb0\xa2\x1c\x11\x17\xfd\xf1svi@_\xda\xc7\xd8\xff]\x94\x94\xf5c\x96\xde\xf1cI1BQ\x98.\xa5?f\x97\xd7ߩ\xcf'\xf7\xcc\u07b2\x1f\xbdq\xcc~K\xa3\x9a\xd1C\x01o\xdew\xf6t\x06_\x8b\x93\xa9\xa5\x05+\xf9د\x04\xd18h\xb6\xf4%\xc4\x14\xe0\x88\v\xe6Ċ3\x1bLW\x10z\x88\xef\x99-v8\x1e\n\xb9iQ9gs\xa2Ҕ5\xa0\x9cyi'\x84\xa4rfV\xa4yM*#\xd7\xc9\xc6\xe0-\x85o\x86\xdeA=\xa7\xc8e\x1fq&e\xee\xe4/>\x8f\xe0\xc6\xe6\n\xe3\xc1\xb5\xdc\xe2\xfcC\xf1\x9c\xdḟ\x8fl\xda\xc7d;\x15\xe5\xd7U\xaf\xadh\xf1_I1BQ\x98.\xa5\xa8\xe5\x9b|{\xe1)q\xe2\xbb\xe5\xb0\xfd\x90\x1f\xfd\xaf\xa7bM\x81\xcddM\xc2r\xd0W\x9c\x10\x1d\x97V\xf1\x9e)I\x18\x8bX\xf6\t\xaa\xd2@B\x9a7\x98\x97\xa4\xfcEH\xa4;\xa7I\xc8X\xa6\xf4C\xf3\x87\xa5}\xca\x1a\x84QʺX˚\vj+S\xa5냰\x90\xb9\xdf\"t)\x88̗, \x99\xd7#C&\xce\xff#ǭ\x10\xd2G\"\xc3&\xcd=\xec\xbd\x12@'\xda\xc7d\xfeۿ\xff\x87x\xdcĿ\xb6\xca\u007f%\xc5\bE\x01\x80\x80GP\x94\xff\xe7\x1a\xa4\xfc\xfa\xf6kk\xef\xf9\xab\xa4\x80\xa2\x00\x80\x01\xb4\x8f\xd9ޏ\a)\u007f?y\xfc\xf8\xf1c\xaf\xbf\xb6\xb1\xd5O%\x05\x14\x05\x00\f\xa0}\xcc\xd6\x1e2H\x996\x86\xf0\x9b\xedm~s%B\x01(\n\x00\x18@\xfb\x98-]\xe8\xdf\xec\xff\xfek\xf9\x98\x05\xff\xb4y\xf3\x16\xfb7~\xfaP7P\x14\x000\x80\xf61\x9b;z6\xbe\xb6\xf9ᅫ\x9ft\xb8\xbe\xa9\xa9\xa9\xd5O\xef\xc6\aE\x01\x00\x03\x10\x14\xa5m\u0558\xff\xf4\x0f\xff\xfe\xeb\xde\xd72[z\xfa\xfb\xfds\x84\x02\x8a\x02\x00\x86 (J\xfc\x987>~-\xf3\xef\u007f\xff\x87Yu~:>\xc1\x80\xa2\x00\x80\x01\xb4\x8f\t\x1d3g\xf7\xa9\xd9\xdc\u007f\xfc\xba\xf97\xf9~:\x87\x82\x01E\x01\x00\x03h\x1f\xf3ZD^]k\xf9k\xb9\u007f\xff\x8f\u07fc\xe5\xc7\u007f\x16\x04E\x01\x00\x03h\u007fma~}G\u007f\xdbl\xee\xdf\xda~\x13Y\x0f\x8a\xc2D\xabr\x00\x00D\x9e\xfe\xd3qAPP\xcf\xe1\xdf\xfc\xa7\xdf\xfcç?\x82\xa20Ѫ\x1c\x00\x00\x91\x9e\xb6V\xf2H\xa0\xf6\xa2\x88\xf9[N\xc2<\n\x1b\xad\xcaG:\x8b\xb9\xb0\xdf\xfb\xcdCY\x80\x91\x8d\xf3rq\u007fۍ\xba\xeb\xfez\a>&\xa0\x15\xa5\xe5h\xee\xec0\xf1a\xf0m\x11\x87\\\xb9T\x12\x00\xf4\xa6\xbf\xa7\xa7\xc7\u007fG(\x86)\x8a\x86K)\x1d`,ǸKbbs\xd0\x17\xae<*\t\x00\xc0\xa00FQ4\\J\xa9\x00\xa3\xf9\x96;\xe5L\x95\x8cݎ<\x93\x00\x00\f\x06C\x14Eå\x94\x0e0\x1aYQ\xd0\xfa\xe0[\x8c$\x00\x00\x83\xc0\bE\xd1r)\xa5\x02\f\x87R\x94\x8e\xa9\xf1\x8c$\x00\x00\x83\xc0\bE\xd1r)\xa5\x02\f\xe7\x12wLJ\xaf\x0f\xe9b$\x01\x00\xf0\x1d#\x14\x05i\xb8\x94R\x01\x86\xd3\x13\x16q\xf2\x8eS\xe4N\xca\xe3\x15*\t\x00\x80\xef\x18\xab(l\x97R*\xc0x\x0es\x1c\xb7PL\xde\xe2\x0e\xb8r\xa9$\x00\x00\xbec\xac\xa2\xb0]J\xa9\x00\xc3\xe9\x98
+ When invoked with the
+ The current status of the analysis features is that of a technology
+ preview; there are many problems and user-interface difficulties
+ which will be addressed in due course. Some known problems are
+ mentioned in passing, accompanied by a warning triangle, ⚠.
+
+ Nonetheless, godoc's static analysis may be immediately useful today
+ for small-to-medium sized Go corpora, and it contains several
+ advances over the state of the art in code browsing.
+
+
+ If any source file contains a compilation error, the source view
+ will highlight the errant location in red. Hovering over it
+ displays the error message.
+
+ ⚠ The mark-up for compilation errors may
+ cause duplication of portions of the input.
+
+ In the source view, every referring identifier is annotated with
+ information about the language entity it refers to: a package,
+ constant, variable, type, function or statement label.
+
+ Hovering over the identifier reveals the entity's kind and type
+ (e.g.
+ Clicking the link takes you to the entity's definition.
+
+ Clicking on the identifier that defines a named type causes a panel
+ to appear, displaying information about the named type, including
+ its size and alignment in bytes, its method set, and its
+ implements relation: the set of types T that are assignable to
+ or from this type U where at least one of T or U is an interface.
+
+ This example shows information about
+ The method set includes not only the declared methods of the type,
+ but also any methods "promoted" from anonymous fields of structs,
+ such as
+ The method set and implements relation are also available
+ via the package view.
+
+
+ ⚠ Pointer analysis is currently quite slow,
+ taking around two minutes for the standard library. This will
+ improve markedly with the planned addition of a constraint
+ optimizer.
+
+ When pointer analysis is complete, the source view annotates the
+ code with callers and callees information: callers
+ information is associated with the
+ In this example, hovering over the declaration of the
+
+ Clicking the link navigates to the sole caller. (If there were
+ multiple callers, a list of choices would be displayed first.)
+
+ Notice that hovering over this call reveals that there are 19
+ possible callees at this site, of which our
+ Pointer analysis gives a very precise approximation of the call
+ graph compared to type-based techniques.
+
+ As a case in point, the next example shows the dynamic call inside
+ the
+ Recall that all such functions have type
+ The same call graph information is presented in a very different way
+ in the package view. For each package, an interactive tree view
+ allows exploration of the call graph as it relates to just that
+ package; all functions from other packages are elided.
+
+ The roots of the tree are the external entry points of the package:
+ not only its exported functions, but also any unexported or
+ anonymous functions that are called (dynamically) from outside the
+ package.
+
+ This example shows the entry points of the
+
+ Notice that the nodes for Glob and Join appear multiple times: the
+ tree is a partial unrolling of a cyclic graph; the full unrolling
+ is in general infinite.
+
+ For each function documented in the package view, another
+ interactive tree view allows exploration of the same graph starting
+ at that function.
+
+ This is a portion of the internal graph of
+
+ Because concurrent Go programs use channels to pass not just values
+ but also control between different goroutines, it is natural when
+ reading Go code to want to navigate from a channel send to the
+ corresponding receive so as to understand the sequence of events.
+
+ Godoc annotates every channel operation—make, send, range,
+ receive, close—with a link to a panel displaying information
+ about other operations that might alias the same channel.
+
+ This example, from the tests of
+ Clicking on the
+ Notice also that the send occurs in a different (anonymous) function
+ from the outer one containing the
+ Here's another example of send on a different
+ The analysis finds just one receive operation that might receive
+ from this channel, in the test for this feature.
+
+ ⚠ There is no UI indication of the state of
+ the analysis (pending, complete, failed) during warm-up.
+
+ ⚠ All analysis results pertain to exactly
+ one configuration (e.g. amd64 linux). Files that are conditionally
+ compiled based on different platforms or build tags are not visible
+ to the analysis.
+
+ ⚠ Files that y\xa7g\x99M\xb3\xcf!Ҁ\xcc\xe3\xac\xf0\xbeШ\xf3\\x\f@\xc6pVxyb\xe6\xf8\xeeM\x1b\x9e[\xff\xec\xda\xf5ϭ\xdf\xf0zs7\xceՀL\xe2\xb0\xf0z\x8aٺp\xf6c\xb3fUϟ=k\xd6c\xd53.\"\u0600L\xe2\xbc\xf0\x1b\xa6\x1d9\u007f\xf6\xfcM\xba|\xf6\xfc\xf9g\xa7!Ƀ\x8c\xc2@\xf8\x8a\x9b\xfa`\xdfJ\xf9pkŹ\x81^\x94\x9a\x81\xcc\xe1\xbc\xf0/\xcc\xfcP\x1f\xfc莃\xfa\xa3\xe7f\x9eK\xb6\x06\x00C\xc1y\xe17\xcc<\xab\x0f\xee\xbfCޮ7\xc6\x00d\f\xe7\x85_?\xb7{\xf7}\xf7\xde\xfd\xb5\x1f\xdc\xf7\xf3\xbe7ft\x1e\xdc\xe0;\xbe9jV\x8b\xbc\x12\xd3\xc4\xe8+\xa4\xee/h%\x00\xd2\xc3y\xe1\xd7U\x0f\xac\xfd\xc6\xd7\xff\xee\x8eo|\xe3;\xbe\xe6\x19ݻ\xa3K\xcdt\xba\x0ey\xf3\x16\x9d\x8a^\xb7\xd5\xd5\x12\xbd\b\x80$8/\xfc\x86\x8a\x8b\x9dǏ\xdf\xfb\xf5\xed\xc7ߣ\x97f\x9e\xef>Oݗc'\x16\xad\x8e]\x86\x8bb\x83\xb4q^\xf8\x17f\x9c\xd6\a\xf7\xca\f?\xb0~V\xbc\fo'<\x00i\xe3\xbc\xf0\x1bf\xc9\x1d\xfa\xac\xefI\xed7͌wZ\xd2\x14\xde\xff\xca\x14\xd7\xc3\rr\xcf~=W\x88\x9cF\xb9l\xb9\xd0v\xaez\xc0Uy!v%\x00\xa2a |ŗ\xa1\x87\x9b+\xe2\xbd\xf1d\n\xbfT\xab\xdf[\xaf\xd5\xcaa\xbb\xd7;\xdeh\xfe\xf8K\xe38Q\xe0\xf9m\xde\x02\xdb\xf5\x00\x88\x80\x81\xf0\xf3\u05ec\u007fv\xdd\xd6ן{v\xdd\xfa\xf9\x8f\xc4\xfb\x1a\x88!|\x9b\xd1w`\xde\xea\xe4\x06\xfaY\xb5|}\xef^S`\xbb\x1e\x00\x118/\xfc\x9e'\xab\xe7Ξ]QQ1{\xf6\xdc'Wv&\x12\xbe\xd6蚧\ak\xcde!\xe1\x97\xea7\x1e\xcdv=\x00\"pXx\x9d\xde\xce\xcb:_\xf5~\xae\xdfv~\x15o\x96!|y\x951\xae*7\x97\x85\x84\x97\xf7\x10\x1e\xa4\x82\xf3\u0093\xf1!\xe1͏w\xc6\xf9`\xf0\xed\x0f\xe4A\xea\x04c\x0f?\xc9hh\x9d\xb8\xd4|\x06\u0083\xb4q^\xf8\x01\x9f\xaf\xdb\xe7{|\xda\x11_w\x9f\xcf&ϼ\"\xbcDW\x8d\x82ʽB\x9e\x97i\x14{\xcdg $%\x19\xe9\xe8q\xff\xd2o\xe3\v\x04@2\xc2Lr\x92\x01@\n@2BL&\x9d9A\xbe\x02\xc9\b1\x99t\xe6\x04\xf9\n$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$#\r\x0e\xa5Y\xe9\x19\x1a|7\x93$+G\a$L\xaeIF6{\xb2R\xfa\x8f\xa6kJ\xea\x13\xf8RH\x06\x8cX\xe3\x11l:pT\r7\xb9\"\x19!\xf0dU\xa9\xad\xd8\xf0P\xc9i\xd13N2`\xc4\x1a\x8f\xa0Ӂ\xa3j\x98\xc9\x15\xc9\b\x81'\xabzHN\xd6\xd1>\xf7\xaf\xdc\nɄ\x11\xab\x00sH\x82N\a\x8e\xaa!&W$#\x04\x9e\xac\x94\x1e%;bw\nɄ\x11\xab\x00sH\x82N\a\x8e\xaa!&\\\x92\x11fO\xd6ޫ\xf4$\x1fs\xc5r\xae\xa3i7b\xf5jت\x97\x87\x1b\x92\x80\xd3\x11:\xaa\x82\x90\x10.\xc9\b\xb5'\xeb\a\xed[Is;\xfb\xe5sG,\xe7:\x9av#V\x8f\x86\xedzy\xb8!\t8\x1d\xa1\xa3*\b\t!\x93\x8cP{\xb2\xf2'&V,WC?\x18\xb1\x8a\x1b\xe6\xeb屆$\xe0tģ\x03\xc2A\xe8$#̞\xac\xbcd\x98\xb1\\\r\xfd`\xc4*l\xd8Q\xaf\r7$\x01\xa7\xe3\xe5X\v\xc2@\xe8$#\xbc\x9e\xacN\xc90c\xb9\x1a\xfa\xc1\x88Uذ\xa3^\x1bnH\x02NG<: \x1c\x84X2\xc2\xe6\xc9\xea\x94\f3\x96\xab\xa1\x1f\x8cX\x85\r;\xea將$\xe0tģ\x03\xc2A\x88%#l\x9e\xacN\xc90c\xb9\x1a\xfa\xc1\x88U\xdc0_\xaf\x03sH\x82NG8: \x1c\x84L2\xc2\xecɪ_1y\xa7\xcfe\t\xca\xf5\"\xedF\xac\x1e\r\xf3\xf5\n\t:\x1d\x91\xa3*\b\tᒌ0{\xb2\xf6\x96i\x01EGܱ\\/\xd2m\xc4\xea\xd50W\xaf\x88\xa0\xd3\x11;\xaa\x82p\x10.\xc9H\x03iq(M\xabghR\x16i\tt3\xa9z\x93)\x96\xd6\xd1\x01\xe9&\xef%#\x1d\x0e\xa5\xe9\xf5\f\x95\x9f\xa3\f\xffn&W\xaf|\xb1\xf4\x8e\x0eH7\x90\x8c\xd0!=G\x13$\xc9z\x93,\x06\xc2\n$#l\xa4ˈ5\xc9z\x93,\x06B\v$#l\xa4ˈ5\xc9z\x93,\x06B\v$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$#\rf\xa5\xd9\xee:\x1a|\x8f\x03%ۇ/\xcf\xc95ɀ'\xab?\xa9سr\xa4-I\x98\xb6f5\xb9\"\x19\xf0dM\x98\x94\xecY9Ҙ$L[\xb3\x98\\\x91\fx\xb2&J\x92\xf6\xac\x1cA:\xb5z\x00\xd3\xd6\xec%W$\x03\x9e\xac\x89\x92\xa4=+G\x90N\xad\x1e\xc0\xb45{\t\x97d\xe4\xbb'\xab\xe5q\xba\x90\x14\xadk\xaa\x9c\\\xaf}\xeb\xdc\xea\xe6B\x12\xddhuފu\xd4\xe0k\xcf*n\xc2\xc6ߩ5\x80$aښńK2\xf2ܓ\xd5\xf68\xfdhk\x11\x99\xba\xaay\xea8\xa6nV7\xd9ފ\xe6\x9fMd\x9d\xb7c\x1dM\xf8ٳz4a\xe3\xeb\xd4\x1aD\x920m\xcdbB&\x19\xf9\xed\xc9\xca{\x9cF\xa7\xa9\x85OW\xd58\xbaI\xa3e\xea\x87w\x03\xeb<\x17\xebH\xd2ǞU܄\x03\x1f\xa7\xd6 \x92\x84ik\x16\x13:\xc9\xc8cOV\x87ǩ\xbe\x88\xb9\x9e|\xc5uS\xdd\xfb\x105:\xcf\xc5:\x92\x8co\xcf\xea\xd1\x04\x87\x9fSk I´5\x8b\t\x9dd\xe4\xb1'\xab\xc3\xe3T_\xe5m'\a\xb8n\xf2\x9d\xe7b\x1dIƷg\xf5h\x82\xc3ϩ5\x90$aښńX2\xf2Γ\xd5\xe1q\x1a]\xc2Jo$g\xb8n\xf2\x9d\xe7b\x1dIƷg\xf5h\x82\xc7ǩ5\x90$aښńX2\xf2ϓ\x95\xf78\x8d^\xa3Ω\xee\x1bj\x1d\xdd\xe4:\xcf\xc5:\x92\xf4\xb1g\x157\xe1$\xbeSk I´5{\t\x99d\xe4\xb7'+\xefq\x1a%\xb7l\xdb\\]ƒ\xb4\xba\xc9w\x9e\x8f\xe5\a\xcaǞգ\t!iL\x12\xa6\xad\xd9K\xb8$#\xcf=Yy\x8f\xd3\xe8\xe3\x8d\x13+\x1b>c\x9bV7\xf9\xce;\xfcP\xb9&|\xecY=\x9a\x10\x91\xc6$aښńK2\xd2@\x02f\xa5\xf2\xf4\x83\xebh\x9c\x9b\\}H\xb8\xc7\xc97a\x92d\r\xfd0| i\xf2^2\x120+\x95\xa6?\\G\x93\x9c\x8d\x8cD{\x9cB\x13\x06\xc9\xd5\xd0\x1f\xc3\a\x92\x06\x92\x11R\x92\x9b\x8dR\xa4\xdeD\xea5\x80\xac\x03\x92\x11JNjk\x88~Q)\x91z\x13\xa9\xd7\x00\xb2\x10HF(\xd1\xd6\x10\x8f\xd3t\x92z\x13\xa9\xd7\x00\xb2\x10H\x06\x00@\x02H\x06\x00@\x02H\x06\x00@\x02H\x06\x00@\x02H\x06\x00@\x02H\x06\x00@\x02H\x06\x00@\x02H\x06\x00@\x02H\x06\x00@\x02HF\x1a\x1cJ\xb3\xc7TT\xeb[\xf6\xa4\x03r\x80\\\x93\x8c\xec\xf6d\x8dK\x1ay\xa2\xaeZ\xbb\x98y\x04/\xfd\x8c^[=\x86\x12\xb7\xe5\xeb\x11i\x8dc\x05\xb1\x1e\xf1\x90\xb1-\xc0\x0f\x99UCx\x0fS\x8fय़\xd1k\xab\xc7P\xe2\xb6|=\"\xadq\xac \xd6#\x1e2\xb6\x05\xf2\xfc\xfa\xd3\xc7K\xb3\xf1Z\x84\x1f\xc1K5F=\x8d\x97~0\xaf0nK-\xcd\xdc\x0e\xf6-\xb0k\x1c+\b\xf5\x88\x8b\x8cm\xd1\xe1ڥ9\xf9\x1b\xb4ԍ\xf1\b^\xea)\xb4\xd4\xd3x\xe9\a\xf3\n\xe3\xb6\xd4\xd2\xcc\xed`\xdf\x02\xbbƱ\x82P\x8f\x98\x00RrQ\"Jz\xc4s\xc6\xd6\xe1us\x95(\xe9\x11\xcf\x19[\x87\xd7\xcdU\xa2\xa4G
\xd0\x1ea\x10\xb7V\x8b\xc4\xea\xf3\xd2\x1e\f\x1dg\xdd\xf8\xe0\x8b\xaebW\xfe\xde\xc8FF]n\v\xec5\xe6\xe8\xd0b+X 6K\x14b\x8d\x93[y\x94\xd8f\x89\xbfn*z\x96\x16\xa4\x86\x9f\xad\xebB\x03\xed\x01\xfc\xc6pC0wz\xb0\xd7u\xdd\xf3\x9c@\xc6\xe3Q\xa7\xfd\xb8\x11\xd3\xc9\x11\xbfV\x8b\x86V\xfa\xc4
\xde\xc9\xf6\xac=n&`\x81f\xba\x88\xdf@\xb3\xfaK\x1a\xc6aG\xa9\x98p\xd0%\x9a\x03\x9f\xe6&\xb4~O\xe2\x05\xe9\x9eԜ\x8a\xc9[L\x90\xee\x05\xd8\x0eE\x02@\x9eѬ\x9e\xef\x0f\x00X(*\v\x98\x10\x9a\xd0+\x84\xefp\x98}\x1e&`N\x13\r\xc1\xe339\xe3\x97S\x97\xf0\x12\xf2L\xc0\xf0o\xd0r\xaev\x1dO\xc0*\xb2cϺ\x00Q\n\xb3\x00[\x89\x80\xf9\xb2a)\n \xf5P[\xc0\b3n\x8b\x95\xf6\xb5|&\x17\x16\x04\xac\xe7.;pw\x19Gjq\xf0\x96ksN\x9e\xd4n\xa6\xee\xa2\xeb\xf9\x19\xdbi4\x1f\xab\x18`-\x1f\x87\x04\xac<\x87\x197\x15d\xe4V3Q\xf1}\x9e\xb7\xb9p0\xe7ntu\xe6-luiw\xa6XE\xa6\xa4W\xf3\xaeL\xd7h0<\xbaQb\x9c%\x03\xc7\v\x06\xdd\xe1\xb3\xcf\xd8\x01\"`78\x8eӿ\xc28x\xbf\xa6\xb8\xf2\xe6,\xcb\xf6g~\x1e*\xea:\xa0ݴe\xaf\x87\xa44'\xabs3\xf6\xb0^\xec\xc1lMξqL\xbd]\x9b\xf8P\xae\x14\xcd\xf1\x8a\xec\xac}\x82\x93+\xd46yR*`\xf8Lz$\x90\x1b\x00\xa4\b\xaa\v\x98\x97\xe7y3S\x01k7\x16\x05\xacMX\x06~@\xf5Ga\xfe\xbc\xec\xaf\xcfi\xd2M\xbf\xb8\x8c\xf1\x11\xcd\x19\xeb\x19M9\x91\x86\x01\x16\x03\xc3F\xfb\x83\x0ed\xf59?G\xac/S\x91v\xdczU\x9bO\xb4\u05f7M{\xe9\xee1\x84B:\x10f?\xdaê5_\x150\xfb%\a\x1f\x95p7Ose\xb7\xcb:h8\xee\xaf\x1e\xf5\x9d\xe5hT\"*`\xdf\xd7s\x1d4}\x85\xbb1\xd2y\xa8\x8aŋ\x1c\r{\xdez7\xe77t\x9fC\xe4\x1a\xb1\x06\xe55\xb7o\xa1\xb1\x89\xac\xa8\xa2ײ/m\x88\xf4_\x9b7\"mݥLi\xe44\xccl\xf3[Z\xb6gе\n\xc3m\x93%\xe5\x026 I\x03@\x8a\xa0\xba\x80a\xaf\xc7\xc1B\x119\xa9\x8c\t\x02\xd64Ď\f5%,\xb8\f\xb4 ҅\xf9\x9a\x05t\xedb}\xad.\xc4zU\x92!$\x85\xdd\xeeVD]\xeaC4huy\x96\x87$\xabc\x05l\xb2N\x88p4=) _\x1b\xdap\x11\x8fp\xc3\xf8\xe2W\x18\xcf\xf6\x91nV\xf0\xc4y\x9aM\x04\xac\xa3\x88E\xe9\x1e\xe6\xee\x93\xd7\xc7\xc2cIk(H\xf7L\xce\x1e?\x8d?GgTh\xb6\x90\xd7\n-I\xf9,\xf4[\xe0\x13\x1a\x87\x17k\xb2H\xef\xab\\\x8b\xe5h\xf2H\x97j&\xb7@\xd66Y3e\x02\xe6F\xb70\x00\xa4\x18\xea\v\x18\xa67c7\xf5x\x05\x02\x01wS\x80\xf4hڄ`ֽmI\xca}pNe\x91\x17\x17\xa2=\xbf\x8aOXN\xde\x11\xfa*\x11\xb0K\x83ւt*%\xa5\xdb\xfc\xf3\x84\x9c\n\x1c\xc8`\xb3\x1b\x9c\xb1\x02&2\x89BȆu\x86>\"N\xb3,D$~\xd5Y{\xb4\x84\x13CD\xb6rL\xbfp\xfdѹw\x04\xc3\x15\xba\xd3\x1e\x12\xb0\xbb(\xb2г\x86:\xaa\xceih\xd2{}϶L$\x84\x88<\x12Ε\xa0\xf9\x82\xbe^G^i\xdbd͌\x12\xb0\x16\f\x00)\x86\xca\x02\xe6\x17\x1e4\x8e\xf3\x81I>\x84\a\xf7\b\xb3\xc1\xda{\x12\x15]\x0e.\x93\xbb\x9btGh\x0f\xec\xd3},go\x01}\x95;\xf1}iԳ\xb5]Ԥ\xfd\xe4VgJ\xeb\x8b+`\xd8f\x15\xb0\xc9r\r#\xf8\xb1N\x88q\xfb\xf8\xd0\xe1\xc6~\xfbi1HwI\xe5y6j<\xc1\t\x9c\xa5;\x83!q\xb9\x8c\"\xce)\x16\xb8\x9bŢ\x1dڒ\xf3y\x9bm\xe7vy\xae\x14\xc1\x89oC\xa3Ҷɚ)\x13\xb0!4\x80\x01 \xc5PW\xc0\x02M\x82_\xe7\xa1)\x10\xf0R\x1cf\xaf7\x80\x9d<\x1d\x0e\x85&W\xa8\x88;m\xaf{<\xb7\x80\xaaj\xc56\x96\xb35\xd2\x03\xa3\xf3\xd2\x04'~&\x15\x88\xf2m\xa3\f/\x0e\b\xa1\xad\x1d\xf1\x05L\x19I\x90\xee\xca\x1a\uaa7f \n\xd8ԋ\x92\x0e\x9a\xaa?\xfa\x84\xf1\x8a\xee\xf84\xe2,\xd6\x1eI\x9c\xd9H0\xed\xbc\x02\xfa\x9e\x1d\x88\x1f\xa4\x1bkhTolB>i\xdbd͔\tX\x9df9\x1f\xb5\x02\xc0\xb2\xa0\xae\x80\xe1f\xaa\ad\b\x19\xeaky\xc4y`T\xd7z՟\a6\x8a\xb6 \xb4\xd3C\x93V6\x82jA\xac3XX\x88\xf14\xb2\x84\x04lK\xf5x\x1d騱\x99\xed_\x10\xb1(\xd5R\u007fTy\xac\x80\xb9\x1b&\xa3\xb3$H\x04\xec\xf0\x05\xb2\x1f\xac\x12\x87\x90\x18\x8f\xe8\xa8\x0f\u007fL\xf0~5\xdef\xe6\xa5ۄ\xf7×]H\x9f\x05\x1c\xa7z\x14\x91\xaa\x1c\xea\xb3\x0flO$`9\xd4u\x96W(k\x9b\xac\x99R\x01\v\xe4%\x88/\x0e\x00\xab\x14\x95\x05\xcc\xc5w;\xddN\x8b8\x13?\xe0q\x98=T\vܦ\xde\xc9\xde\x15\x98\x89?\xaa\xe9\xb1\xda<\x82N\x94\xa7\x9d\xb2\x9eJ\x13\x1eϝ\xd3\\jߕA\xaeg\x9cy\xbbw\xee=\xf2\tƧP\xa9\xa5\xbd\x02\x11\xc9\xf5d\xe7\\oۯ\x89\x15\xb0}(\x81\nL}\xd61ۧ\x9b\x9a\xad?\xfd=n\xe5.tޮ\xe2\xca\xeeL\xbc\xb5\xd7|917[kx\xf4\x9aH\xd7\xee\xfa\xfeo\xaf\x88\xbf-r\xa5]\x12\n\xf6\xfe$\xef\xfa\xdd\xe3\xc8Dg\xd7\x1f\x19ģG6\xd9<\xb8\x0e\x1d\xbc^\x97\x8f\xb4\r\x83\xd2\\)\x1a\xb4g\xb0\xa7 \x8bJ\xaa\xa4m\x91$\x9b\x89\u007f\xd9f\x13\xde\xf6\xcbh9\u007f0\x05\x00˃\xca\x02\x86==\x16S۠8\xbb\xc0C]`\xcd,\xd5ej\xf7$(\xb6L\fh\xa8WkS!u\x82\x05~\xb3=c\xfbׂ\x98\xf9\x8fg\xa5\x17\x0eal!G\x1b\x88\x8c\xe5ji\x8f\xa5k\xa76\xebS\xf6\xf8\xce[\x91\x93\xbe\xebA\xac\x80\x99\xb5|tV\x98`\x19\xc7\xf5\x15s\xc5}\x1cw\x1e\a;*\x8b\x0e\xd5߯\xd4\x19;\xa9\xd3\xeb)\xc9\xe4\xe8|ֱ\xd3e%\xc6\x11\xb1ę\x9f\x88^)\xd7\xc1\x9ĉ6:\xe3\x8b\\\xac#\x83\xbc\x1eÁ˹\x1am\xa9y\x9b\xa6P\x9a+%\xaf\xee`fv\xb9\x87&%m\x8b$\x8f\x88N=\xf6\xab\x03[\xfaI\f\x00)\x87\xda\x02\xb6\xaa\xf0n>束\xf7\r\x1d\xc8Z\x8a\xfb'\x81\x13\xff\x03Q\xad\xb1$3\xf9@\xb4h*\xe6\x93\xd9\x00\xc0\xeac]\vX{\x96\xd0\xe1\nhc\xe6\xd4/\x80\xe5\x170|9G>\x93l\xb9\xf0f\xc3b\x14@J\xb2\xae\x05l4\xcd\xc1\xb6\x8e\xb4\xc8L\xab\x85\xa3\x82\x80\x01\x00\x90q~\xef\xa6\x00\x00 \x00IDAT\x90u-`\x81\x8a\xf4c-\xbd-\xc7җ\xf2;fW\x17\xaa\x1eT\xfd\xb9)\x00\x00\x12ֵ\x80alݓ\xad\xc9\xdecMf\xa6ħ\b\xa1\x8d\xaedV\x00\x00,#\xeb\\\xc0\x00\x00He@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0\x00\x00P$\x15f9\x82\x80\x01\x00\x10\x8b\xa7b\vڟ\xcch\xe5\x01\x01\x03B\f\u05fcNf\xb2\xec\xb4\x17x\x93\x99(\xb1\xc4b\x80\xb7 N$\x9d@^\x1eߣ\xfe\x02W\x8bFm\x01\xf3t5\x9b,\x03\xa1\xc5\x1f\x1c|x\x12|\xaf\xea˱~\b\xaeq\xe2\xe2]\xcbǣݜ1\x88\xfb9n\xf7\xa3x&S\xb5\x9f\x95\x18\x1f\x9d\x98\x88w|a\xdc\xe1Z\x83\xf8>\xc7q\xb7\xf1m\xf2z/\x81\xe9\v\x1d\xf7K\xb2\xf9\x92F\x83{\x11\xdf̾[\\#[\xff,\xbe\x91\x8c\x06$.C\xfb\xd7ke\xfa\xda`b\xe3\b\xe1b\xb1\xd0\x06q\x9f\xd5>\x8dw|\xa9|\xc5qt\x15\xdd\x0e\x8e\xfb*\xea\xc8ءa\xa5\x02\x1f\x8a\x0fܠ\x864\xe5\xdf\U0004fce5
u%~CO\xcf\b\xfd5mOG\xbb\x9fݲ߁Jێ\xfbQ\x8b\xe6,\xcdr\xeb\xe5\u007f\xf7\xef\xa6k\x9a\xfe\xbc{\xff\xffr\xc7\xe1\xca'\xcf\xfd\xe8O\xf2\x17\x1b\x9f\xff䊾D\xfdwJ\x85?\xf3V\xbczt\x13.z\xfb\xb3\xe8G\x87\xf6Mw\xbe\xfd\xdb'\x8ah\x937\xce\x10w6\xa3\x9fX\xba\x12\xff\xbf\xf4\x02\x19θ\x13+\xac\xc47\xfc\x8a\a\x8a?\xf3\xb3\x8f\xd9g\x9b^\xff\xfa\x9d\xa2Ͼ\u07bf\xfbO\xcbVMJ\xdf\x0fG\xc0\xe4ѓmM\xed}\xec\xce\xe3\x97]\xad\xcd\x1d\x83\xf4\x82\x95ϰ\xc7\"\x1b\x97\xe1\x91бjgj\x81\xd2\xf9;\x9b\xc4&U\xa2hUs\x86u\xc9\x12\xcf\xc9쌪p\x97ǩ\x8ck䯋\xb1\xfa8\xa1\xf6\x04\xda\x13\xd4\xe0\xfa돬\xff\xd1\xfe\xb7\x1f)\xda\xf9\x9c\xf2S\xd1\xff\xa36\xcf\xc9o\xef|\xf5ᢊ\x9d\xec\xfc\xaf\xff\xe53\x1b+\x9ef\x8b\b\xaf\xbf\xb9Ż\x85\xad\x03\xe3<(\xea\xf0\xfc&\xefN\xedq\xb6/\x93\x1f:\xfb\xe5\xb8\xfa,$\xaed\x13\xb3\xbf\xd7\xe61\x94/\x9c_3cY\xde\xf2\xea\xbeb5\x8b\xa75[\xd6\v\xf8`w\xd9Ɲ\xef\xd1?\xb8\xeci\xb9\x9d\xf8\x81O\xb8_\x85M\xa3\x90\x1f<@\x17x\xbd\x8b\xf1\x03\x1f\xf0θ2(\xbc\xbe^\x9f\x106<\xf05\x8evPǜ\xec\x04\xb0\xf5t\xe3\r\x1e)\xa3\xb49[*`\xcfBRJ\x95>zA +%\xb3@\x9d\x84\xe8\xbc?ùF\xbb\xf7۔\x86,\xdd\xf7\x970\xa6\x13:\xcf\xd1\x15i\xe6q\xf8@)\xdf\xf3\xf2\xf3J\xd1?2\xcaK\x8f\xea\x17On\xaa<\xf2v\x91rZ\xa2\x1e\x1d\x99>$\xe8-{\x92-P7\xce\x10w6\xa3\x9fXzP\xb7\x18%ҝq'V}\x16\xf2%\xf5\xa0\x19~\xc5\x03ş\xf9Y\xc7\xecz\x99r*\x8aq\xf1;\x18\xef]\xb6j\xcac\xa3\x03\xa5Ҩ\xbc\\,\xb5\x80\x01\xb3\x10\x96\xc9\xdbs
\x8bS\nG\xd3\x12N\xac\vuM\x9f߅\xbdG\xf0\xa9b\xf0\x94VA\x14&\v\xa9\xa7\xf9x\xb4\xf4[bM\x16I\f\xc6Z\xb6\tkǷS\xa6\u007f\\X\x159G\x99K#\xce\xccVq\x17\xe9\xbe)\xba98E\x01OT\xc0\x17\x8cU\x14\xb6Ki+\xa6.\xb7\xb5\xd5\xe8AJSЂ\xa6K\xb3\"\xf0j\xe3g\x92\x9c\x19\xf2\x18\xc5\xde䚙\x9d\x88\x8fXٰ\xb4?\xe4S\x1cT\xa7\xae(l\xac5\xa8!ZT\x14\xda\xdc4%\xae\xf9\xbe\xa5\x18\xa7\x14\x8e\xa6\x1d\xc1\xce\xdb\xdb\xca)\xa3/\xa2\x12D;fG`\xbf\xb4\xb7\xe7(si\x82W\xe1W;\x1e\xa3\xcc$\x19\xb8o\x8an\x0eNQ\xc0\x13\x15\xf0\x05c\x15\x85\xedRJ\x18\x8ey\x94\x8b\xdc\x14\x8e\x8b$\xb2VB\xc6\xf4\xfb\xb9\x12\xfc!2\x12\xa1{ؠTT\x94)\xab.}J\x1b\x96.\x0e\xc37\xc7/ẹ|q\xc3=\x8b\x82R\x14\xda\xdc\x14_=\xbe`\xc2\x13\xb3\nGS\xe14K\x14؎)\x91x\xda\xe9\x03,\x10\xb2vL\xc7\x13\xb1\xfds\xbc)\xca4<\xfd2;R\xd17E7iEi\xdaļ3XV\x14\xf0D\x05|\xc2\bE\xd1r)\x15\xe8o\xa9\xcbmi\xf3Z\xcb\x10p1\xb8\xbc\xa4\xaaE
\xc3<\x05\xbb\xe8\x96\x11WY\v\xaf`\x83Iu\xa8.\x89\x88]Krʆ:_\x86\xa4`Ӈ\x9b2\xf1!֖\xc6\xd3ɕ}R\x1c.\x85F\xb8S%}Zh\xe4\xd7\xe7\x15\xf1\xb1;%\x05{过\xfech\xe8\xd7C\xbf\x93\xfe\xd4x\x13#\xf9>\xebi\xb2,\xf9\xe2i\xd6$2\xbfi\xe6<\x9a\u007f\x0e>P\xa9U\x8d\xf2\xccK\x9e-analysis
flag, godoc performs
+ static analysis on the Go packages it indexes and displays the
+ results in the source and package views. This document provides a
+ brief tour of these features.
+Type analysis features
+godoc -analysis=type
performs static checking similar
+ to that done by a compiler: it detects ill-formed programs, resolves
+ each identifier to the entity it denotes, computes the type of each
+ expression and the method set of each type, and determines which
+ types are assignable to each interface type.
+
+ Type analysis is relatively quick, requiring just a few seconds for
+ the >200 packages of the standard library, for example.
+Compiler errors
+
+Identifier resolution
+var x int
or func f
+ func(int) string
).
+
+
+
+
+
+Type information: size/alignment, method set, interfaces
+net/rpc.methodType
.
+
+
sync.Mutex
in this example.
+
+ In addition, the receiver type is displayed as *T
or
+ T
depending on whether it requires the address or just
+ a copy of the receiver value.
+
+
+
Pointer analysis features
+godoc -analysis=pointer
performs a precise
+ whole-program pointer analysis. In other words, it
+ approximates the set of memory locations to which each
+ reference—not just vars of kind *T
, but also
+ []T
, func
, map
,
+ chan
, and interface
—may refer. This
+ information reveals the possible destinations of each dynamic call
+ (via a func
variable or interface method), and the
+ relationship between send and receive operations on the same
+ channel.
+Call graph navigation
+func
keyword that
+ declares a function, and callees information is associated with the
+ open paren '(
' of
+ a function call.
+rot13
function (defined in in strings/strings.test.go)
+ reveals that it is called in exactly one place.
+
+
+
rot13
+ function was just one: this is a dynamic call through a variable of
+ type func(rune) rune
.
+
+ Clicking on the call brings up the list of all 19 potential callees,
+ shown truncated. Many of them are anonymous functions.
+
+
testing
package responsible for calling all
+ user-defined functions named ExampleXYZ
.
+
+
func()
,
+ i.e. no arguments and no results. A type-based approximation could
+ only conclude that this call might dispatch to any function matching
+ that type—and these are very numerous in most
+ programs—but pointer analysis can track the flow of specific
+ func
values through the testing package.
+
+ As an indication of its precision, the result contains only
+ functions whose name starts with Example
.
+Intra-package call graph
+path/filepath
package, with the call graph for
+ Glob
expanded several levels
+
+
net/http.ListenAndServe
.
+
+
+
Channel peers (send ↔ receive)
+net/http
, shows a send
+ operation on a chan bool
.
+
+
<-
send operator reveals that this
+ channel is made at a unique location (line 332) and that there are
+ three receive operations that might read this value.
+
+ It hardly needs pointing out that some channel element types are
+ very widely used (e.g. struct{}, bool, int, interface{}) and that a
+ typical Go program might contain dozens of receive operations on a
+ value of type chan bool
; yet the pointer analysis is
+ able to distinguish operations on channels at a much finer precision
+ than based on their type alone.
+make
and the receive
+ operations.
+chan
+ bool
, also in package net/http
:
+
+
+
+
Known issues
+import "C"
require
+ preprocessing by the cgo tool. The file offsets after preprocessing
+ do not align with the unpreprocessed file, so markup is misaligned.
+
+ ⚠ Files are not periodically re-analyzed.
+ If the files change underneath the running server, the displayed
+ markup is misaligned.
+
+ ⚠ Additional issues are listed at go.tools/godoc/analysis/README.
+\xf9\x0f\xbbz\x901X\b\x1f\x884\x00d\x1c\x16\u0093\x8c4ح\x03\x05\xb0\x10^\x8f4\aw\xf7\x1d\xd9\xec;\xf2\x92\xfe\xaf\xf7\xf8v\xcbs\xc9K\xcd\x00H\x1d\x16\xc2\xcb⛅7߬\xee6\xff\xa5Vjv\xe0\x18\x01\x90.,\x84\xd7\xe9\xbdI_~\x1c\xf8\xd7}1\xe2\xa98\xa5f\x8f.!\x00҅\x85\xf0\xc6\x1bO\x9d\xf1\x9e\x8dSj6u\xb1\xddd\x00\x12\xc2Bx\xe3,\xcd\xf9\x81^\xfbӒ\xa1R\xb3Sㄨ\xf2\x97\b\x91\u007f\xab5\x10\xec\xa7\xc4n\f\x80\x04\xb0\x10\x9e\x12\xbe\xf1\x14*5\xf3\x1f\xf6\xe4\x1c\xa6]cw\x9d\xa0\xaeC\xde\xd2\xe9z\xb2ǵ\x96@z\xb0\x10>\xf1gi,\xa5f\xfe\xa5\xe5WK6\x9a\x8b\x11i\xc0 `!|\xe2\xcf\xd2XJͨ\xe7ᢪ@\x96\x87\xf0`\x10\xb0\x10\x9e\x12G\x9ap\xa9\x19Q\x8b8\x14\x18Ax0\bX\b\x9f$\xd2XJ\xcd.\x14֗|a.6\x84\xdf\xf9\xa9\xfd:\x00\xd8\xc3B\xf8$\x91&\\j\xd6_^O\xcb\xdcf\xa6q\xbb\x89\xae\x88&\xfbu\x00\xb0\x87\x85\xf0\x94 \xd2XJ\xcdz\x0e-/\xb8@\x1dy+\x0e\xdd\"Y\xba\xb7\xa5\xc5\xed\xfa,\xcej\x00\xd8\xc2B\xf8D\x91\xc6Rj&\x87\xabh\x85\x10cewӭ\x15\xf9\xb9\xd3\xdb\xedV\x01 .,\x84\xc77\x9e\x80*X\bO\xf8\xc6\x13P\x04\v\xe1\xf1%n\xa0\n\x16\xc2#\xd2\x00U\xb0\x10\x9e\x10i\x80\"X\b\x8fH\x03T\xc1BxD\x1a\xa0\n\x16\xc2\x13\"\rP\x04\v\xe1\x11i\x80*X\b\x8fH\x03T\xc1BxB\xa4\x01\x8a\xe0\"<\x00J`!
\xfcp\x99Wg\x87.|x)\n\xd0\xd4\xc1Bx\x87#\rmѶ\x98\x83`\x93YDg\x19\x9dq\xe7\xe6U>#\xc42k\xbf\x99\xbe\xdfvOȟަ\x1f\xf4\x8e\x95\xe7\xf0\xfd\xe5\x85~K\xbf\xd9t\xfb\xb9\x81\xde4!r?\xb0,E\x01\x9a:X\bO\xceF\x1a\x90E\xb0\x10\xde\xe1H\x03\xb2\b\x16\xc2;\x1di@\xf6\xc0BxB\xa4\x01\x8a`!<\"\rP\x05\v\xe1\x11i\x80*X\bO\x884@\x11,\x84G\xa4\x01\xaa`!<\"\rP\x05\v\xe1\t\x91\x06(\x82\x85\xf0\x884@\x15,\x84G\xa4\x01\xaa`!\xe5H\x13\x8e1_\x9e\x8e\x9e\f@\n\xb0\x10\x9eR\x8d4\x92\x8bG\xf6\xed۷砼\xddw\xf08\x92֊o\x11\xf5?莜\x00\x80\r,\x84\xa7D\x91&\xf0N\xeb\xe1~\xb2\xd4l\xf7\xb4\x89\xfa.\xea\xfa\x8dh\xbb%\xcf\xd2T\x1e\xde_\x9e\xff\x91u\x02\x00\xb6\xb0\x10>a\xa49\x11\xfe,M\xb8f{\xffX!\x9a\xa8E\x88\xb1\xfb\x89\x1e\xf4,\xce+\xae\x91=\xf3\xe1\t\x00\xd8\xc2B\xf8d\x91\x06\x80ႅ\xf0\x84o<\x01E\xb0\x10>\xd9Y\x1a\x00\x86\v\x16\xc2#\xd2\x00U\xb0\x10\x9e\x10i\x80\"X\b\x8fH\x03T\xc1BxD\x1a\xa0\n\x16\xc2\x13\"\rP\x04\v\xe1\x11i\x80*X\b\x8fH\x03T\xc1BxB\xa4\x01\x8a\x80\xf0 \xab`!<2