首頁 >後端開發 >Golang >為什麼我的 Go 解析器沒有偵測到結構類型的文檔註解?

為什麼我的 Go 解析器沒有偵測到結構類型的文檔註解?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-07 19:32:021044瀏覽

Why is My Go Parser Not Detecting Doc Comments on Struct Types?

Go 解析器未偵測到結構體類型的文件註解

在Go 中,辨識結構體類型關聯的文件註解可以透過解析器和ast 套件。以下是為什麼可能檢測不到這些註釋的調查:

問題

問題中提供的源代碼演示了嘗試使用以下方法檢索結構類型的文檔註釋Go 的解析器套件。然而,輸出中缺少結構類型 FirstType 和 SecondType 的文檔註解。

解決方案

要解決這個問題,我們需要考慮 Go 如何處理文件在其抽象語法樹(AST)中。 go/doc 套件建議,當 TypeSpec 沒有附加文件時,應使用父 GenDecl 的文檔。

檢查GenDecls

調整問題中的程式碼包含*ast.GenDecl 的情況:

for _, f := range d {
    ast.Inspect(f, func(n ast.Node) bool {
        switch x := n.(type) {
        case *ast.FuncDecl:
            fmt.Printf("%s:\tFuncDecl %s\t%s\n", fset.Position(n.Pos()), x.Name, x.Doc)
        case *ast.TypeSpec:
            fmt.Printf("%s:\tTypeSpec %s\t%s\n", fset.Position(n.Pos()), x.Name, x.Doc)
        case *ast.Field:
            fmt.Printf("%s:\tField %s\t%s\n", fset.Position(n.Pos()), x.Names, x.Doc)
        case *ast.GenDecl:
            fmt.Printf("%s:\tGenDecl %s\n", fset.Position(n.Pos()), x.Doc)
        }

        return true
    })
}

執行此程式碼會產生FirstType 和SecTypeFirstType 和Sec說話缺少的文檔註釋。

意外行為

雖然此方法發現了缺失的 Doc 註釋,但它也揭示了 GenDecl 的文檔是無意包含的。這是因為 AST 將結構類型定義視為類型定義的括號版本的縮寫,無論分組如何,都以類似的方式處理所有定義。

結論

有效檢索 Doc對於使用純 AST 的結構類型的註釋,承認這種行為至關重要。然而,使用 go/doc 套件仍然是首選方法,因為它規避了這些複雜性,並為 Go 中的文件解析提供了全面的解決方案。

以上是為什麼我的 Go 解析器沒有偵測到結構類型的文檔註解?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn