12.3 Display:一个递归的值显示器

接下来我们看一下如何改善组合类型的显示。这次,我们不再实现一个fmt.Sprint,而是实现一个称为Display的调试工具函数,这个函数对给定的任意一个复杂值x,输出这个复杂值的完整结构,并对找到的每个元素标上这个元素的路径。下面先看一个例子。

在上面的调用中,Display的参数是一个从表达式求值器生成的语法树(参考7.9节)。Display的输出如下所示:

我们应当尽可能避免在包的API里

边暴露反射相关的内容。我们将定义一个未导出的函数display来做真正的递归处理,再暴露Display,而Display则只是一个简单的封装,并且接受一个interface{}参数:

在display中,我们使用之前定义的formatAtom函数来输出基础值(基础类型、函数和通道),使用reflect.Value的一些方法来递归展示复杂类型的每个组成部分。当递归深入时,path字符串(之前用来表示起始值,比如“e”)会增长,以表示如何找到当前值(比如“e.args[0].value”)。 ...

Get Go程序设计语言 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.