Go Guru(golang 代碼導航工具) 的使用

翻譯來源:http://golang.org/s/using-guru
Guru 是一個導航go 代碼的編輯器集成工具
這篇文章將展示了我們怎么使用Guru。在開發golang項目的過程中我們希望我們的編輯器回答我們各種各樣的問題。例如:

  • 標識符(名字,對于變量、常量、函數、語句塊)在哪里申明?
  • 所有對此申明的引用在哪里?
  • 此表達式的方法變量是什么?
  • 這個包的api 是什么?
  • 哪些具體類型實現此接口?
  • 動態調用可能的調用者是什么?
  • 方法可能的調用這是什么?
  • 在此channel 上發送的值可能在哪里接收?
    除了它帶來了一些在任何ide中沒有發現的高級靜態分析功能,它還帶來了很多重量級ide才能帶給你的令人興奮的效果。
    GopherCon 2014 talk on the Go Guru (https://www.youtube.com/watch?v=ak97oH0D6fI).
    國內的視頻地址(http://www.tudou.com/programs/view/VQgpql8a8fk/
    <p>
    Guru支持十幾種查詢。把你的光標(或者文本選擇)放在變量名稱上或者你感興趣的表達式位置上,然后通過你的編輯器來執行guru命令查詢。
    根據你的編輯器來選擇你是使用菜單還是命令行。對與大多數查詢指令來說查詢的結果都會緩存在編輯器中。請看下面視頻截圖。
  • Setting Up
  • Queries
  • Name Queries
  • what
  • definition
  • referres
  • freevars
  • Type Queries
  • describe
  • implements
  • Call graph queries
  • callees
  • callers
  • callstack
  • Alias queries
  • pointsto
  • whicherrs
  • peers

Setting up

下載和編譯guru工具,然后插入到你的.PATH路徑下


$ go get golang.org/x/tools/cmd/guru
$ go build golang.org/x/tools/cmd/guru
$ mv guru $(go env GOROOT)/bin ?(for example)
$ guru -help
Go source code guru.Usage: guru [flags] <mode> <position>...
對與許多guru查詢來說,定義包的工作空間必須配置$GOPATH 環境變量。雖然guru是一個命令行工具,但是需要借助你的編輯器來執行。大多數guru查詢的輸出是一個診斷列表,每一個前綴都有源文件的名稱,行號,和列號。和一般編輯的診斷輸出類似。大多數編輯器可以在緩沖區中顯示編輯輸出,以便點擊診斷可以在正確的位置打開相關的源文件。請參考對應編輯器文檔以完成安裝。

編輯器| 鏈接
-----|-----|-----
Sublime text|https://alvarolm.github.io/GoGuru 安裝文檔:http://www.lxweimin.com/p/7785511097ef
Acme|https://github.com/davidrjenni/A <p>https://github.com/mjibson/aw
Atom.io |https://atom.io/packages/go-oracle (現在不可用)
Eclipse |https://github.com/GoClipse/goclipse
Emacs |https://github.com/dominikh/go-mode.el <p>https://github.com/golang/tools/blob/master/cmd/guru/go-guru.el
Vim |https://github.com/fatih/vim-go
Vscode|https://github.com/fatih/vim-go

如果你的編輯器沒有出現在以上的列表中,請想法子為其提供幫助支持。大多數查詢可以通過少量重用編輯器的現有機制來運行編譯器的邏輯來支持。這個邏輯必須構造一個指定所需類型的查詢和當前光標位置的命令,并將該命令的輸出定向到編輯器緩沖區。
某些功能需要額外的編輯器特定邏輯。Guru可以分析修改的但未保存的編輯器緩沖區,但這需要編輯器將修改的緩沖區的內容提供給guru的標準輸入。編輯器可以在每次光標移動時自動高亮與當前選擇標識符相同的標識符。或者它可以直接跳到定義查詢后的變量聲明處。當提供-json標志時,Guru以JSON格式發出輸出; 這使得編輯者更容易解析工具的輸出。
Pointer分析范圍:一些涉及到指針分析的查詢,一種用于回答“該指針可能指向什么?”的問題的技術。對workspace中的所有包運行指針分析通常太消耗資源,因此這些查詢需要一個限定區域的附加配置參數,分析該參數指定的范圍的包集。將范圍設置為您當前正在其上工作的應用程序(或者應用程序集,可能是客戶端和服務器)。指針分析是一個整體程序分析,所以范圍內唯一的包是main和測試包。范圍通常被指定為一組用逗號分隔的包,或者像github.com/my/dir / ...這樣的通配子樹; 請查閱編輯器的具體文檔,了解如何設置和更改范圍。

Queries

Guru支持大于十幾個查詢,以下列出來help 信息

callees 顯示所選函數調用的可能目標
callers 顯示所選功能的可能調用者
callstack 顯示從調用圖從根目錄到選定函數的路徑
definition 顯示所選標識符的聲明
describe 描述所選擇的語法:定義,方法等
freevars 顯示選擇的自由變量
implements 顯示所選類型或方法的“實現”關系
peers 顯示對應于所選頻道操作的發送/接收
pointsto 顯示所選指針可能指向的變量
referrers 顯示由所選標識符表示的所有引用
what 顯示有關所選語法節點的基本信息
whicherrs 顯示所選錯誤變量的可能值

我們將把這些查詢分成四組相關的特性---名稱,類型,調用圖和別名---使用這個程序作為一個運行的例子:


11111.png

Name queries

Names (標識符)相關的聲明引用。 第一組Guru查詢幫助您從引用導航到聲明,然后再返回。

what

what查詢盡可能快地定位當前源位置。 只要光標位置改變。用戶不需要做什么操作,只要鼠標位置發生變化編輯器就會做出相應的反饋。它可用于高亮顯示與當前屏幕截圖相同的所有標識符,如本示例屏幕截圖所示:

image1.gif

definition

定義查詢查找所選標識符的聲明。 在一些編輯器中,它可以將光標直接跳到該位置。


image2.gif
image2.gif

示例:在此vedio中,我們使用連續的定義查詢來查找http.Request的URL字段,類型url.URL和類型url.Userinfo。

referrers

referrers查詢查找對所選標識符的引用,掃描workspace中的所有相關的包。

image03.gif

示例:在此vedio中,我們使用referrers 查找對處理程序類型的所有引用,以及在整個工作區中對http.Request的所有引用。

freevars

freevars查詢會使用枚舉的方式來選擇自由變量。 “自由變量”是一個技術術語,指的是在選擇中被引用但未被定義的一組變量,或者簡單的說,它的輸入。如果您正在考慮是否將選擇的語句重構為自己的函數,那么此信息很有用,因為自由變量是函數的必要參數。 當你想了解一個復雜的代碼塊的輸入是什么時,即使你不打算改變它,它也是有用的。
<p>
為了使結果更有用,查詢的輸出與教科書定義的自由變量略有不同:

  • 輸出不報告在包級別定義的任何名稱,因為它們不需要作為參數傳遞到函數;
  • 對于每一個自由的結構體變量,
  • 輸出還報告對自由常量和類型的引用,即它報告所有自由名稱,而不僅僅是變量
image04.gif

<p>
示例:在這個video中,一個關于fmt包的十幾行的freevars查詢顯示所選的語句塊取決于typeString,v和p的幾個部分。 如果我們將它提取為一個單獨的函數,我們可能會使其成為具有以下簽名的* pp方法:
> func (p *pp) fmtBytesSharpV(typeString string, v []byte)

Type queries

此組查詢解答有關表達式類型的問題。

describe

describe查詢顯示所選語法的各種屬性:其語法種類,表達式的類型,常量表達式的值,大小,對齊方式,方法集和類型的接口,標識符的聲明等.你可以描述幾乎任何一段語法,Guru將打印所有有用的信息。包的描述(例如fmt.Println中的fmt)包括其所有導出的成員,它們的類型,方法和值(對于常量)。 如果描述了當前包(通過選擇包聲明包p),描述也包括非導出成。

image11.gif

示例:在這個video中,我們描述處理程序類型,表達式w.Header(),http.Request的URL字段,最后是日志包。

implements

implements查詢顯示由所選類型實現的接口,如果所選類型本身是接口,則顯示實現它的具體類型集合。 對值進行的實現查詢報告有關表達式類型的相同信息。 對方法的implements查詢顯示與之相關的抽象或具體方法集合。

image08.gif

示例:在此video中,我們列出了類型處理程序實現的接口,類型為http.ResponseWriter和值req.URL。

Call graph queries

此查詢回答關于調用圖的問題,即函數調用點和被調用函數之間的關系。 對于靜態函數或方法調用,關系是顯而易見的,但對于動態調用,大師必須使用指針分析。 因此,必須在使用這些查詢之前配置作用域。

callees

被調用方查詢顯示所選功能調用站點的可能的調用目標。 光標或選擇必須在函數調用表達式中; 選擇不必是精確的。 此查詢使用指針分析來建模動態函數調用的影響,因此它需要一個作用域。

image02.gif

示例:調用接口方法的調用程序查詢w.Header()告訴我們,在此應用程序中,調用可能分派兩個可能的具體方法,一個用于HTTP v1,另一個用于HTTP v2。

callers

調用者的查詢顯示包含選擇的函數的可能調用者。 此查詢使用指針分析來建模動態函數調用的影響,因此它需要一個作用域。

image09.gif

示例:盡管沒有對handler.ServeHTTP方法的直接調用,調用查詢顯示它由HTTP服務器包動態調用(因為它是一個注冊的處理程序)。

callstack

callstack查詢顯示從調用圖的根到包含選擇的函數的任意路徑。 這可能有助于了解在給定程序中如何達到該函數。 此查詢使用指針分析來建模動態函數調用的影響,因此它需要一個作用域。調用堆棧信息的精度和有用性變化很大,特別是如果調用路徑包含更大程度的動態調用。 所選的調用棧可能是不可行的,也就是說,在任何實際執行期間永遠不會發生。

image01.gif

示例:此video 顯示對handler.ServeHTTP函數的callstack查詢。 它通過HTTP服務器中的幾個函數逐步向上遍歷生成的調用堆棧的幀,然后到達主調中的ListenAndServe調用。

Alias queries

別名查詢回答有關指針(以及其他引用類型,如切片,地圖,函數和通道)及其指向的內容的問題。 與調用圖查詢類似,別名查詢使用指針分析,因此必須在調用范圍之前配置范圍。

pointsto

pointsto查詢顯示指針可能指向的可能對象的集合。 它也適用于其他參考類型,如片,函數,地圖和通道。 此查詢使用指針分析,因此必須指定范圍。

image06.gif

示例:在此video中,pointsto查詢告訴我們,在此程序中,http.ResponseWriter w可能包含兩個可能的動態類型:* http.http2responsewriter和* http.response。 此外,每個指針都指向一個由復合文字表達式(“complit”)創建的變量。 單擊使我們到創建http.response變量的位置。

whicherrs

whicherrs查詢報告在類型錯誤的值中可能出現的一組可能的常量,全局變量和具體類型。 當處理錯誤時,此信息可能是有用的,以確保所有重要的情況都得到處理。

image05.gif

示例:對http.ListenAndServe調用結果的whicherrs查詢顯示可能的錯誤是EINVAL(程序員錯誤),系統調用錯誤或網絡錯誤。

peers

對等端查詢顯示所選擇的發送或接收操作的信道操作數上的可能的發送/接收的集合; 選擇必須是< - 令牌。 此查詢使用指針分析,因此必須指定范圍。

image00.gif

示例:在計數器函數中的發送語句上的對等方查詢報告信道在主處理器中被分配并且在處理器.ServeHTTP方法中被接收。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • Spark SQL, DataFrames and Datasets Guide Overview SQL Dat...
    Joyyx閱讀 8,344評論 0 16
  • __block和__weak修飾符的區別其實是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用,...
    LZM輪回閱讀 3,354評論 0 6
  • 幸福只需要一點點 如果天上的云彩不美麗,我不會不幸福,因為還有白白的云朵; 如果天上的星星不出現,我不會不幸福,因...
    紅豆印跡閱讀 274評論 0 0
  • 空氣有些尷尬,第一次看見他戴眼鏡的樣子,還是特別斯文的那種,昏暗車內時不時閃來幾束光透過消瘦臉頰,嫻熟換擋,靈動的...
    西舊閱讀 245評論 0 2