本期分享:
1.切片共享底層數組
2.獲取Go函數的注釋
切片共享底層數組
在Go語言中,切片和數組是兩種不同的元素,但是切片的底層是數組,并且還有一個比較重要的機制:切片共享底層數組。
下面這段代碼演示了切片(Slice)的底層數組共享機制,以及修改一個切片對其他相關切片和原數組的影響:
func TestSlice(t *testing.T) {// 定義原始切片original := []int{1, 2, 3, 4, 5} // -> original: [1 2 3 4 5]slice1 := original[1:4] // -> slice1: [2 3 4]slice2 := original[2:] // -> slice2: [3 4 5]// 修改slice1的第一個元素(會影響底層數組和其他切片)slice1[0] = 100// 打印結果fmt.Println(original) // [1 100 3 4 5]fmt.Println(slice2) // [3 4 5]
}
上面我們說明了一個結論就是,Go語言中的切片是底層數組的視圖,多個切片可以共享同一個底層數組。 當通過 original[1:4]
和 original[2:]
創建新切片時:
slice1
的底層數組從 original
的索引 1
開始,包含元素 [2, 3, 4]
。
slice2
的底層數組從 original
的索引 2
開始,包含元素 [3, 4, 5]
。
當通過slice1[0] = 100
修改切片時,直接修改了底層數組,導致 original
變為 [1, 100, 3, 4, 5]
。
切片共享底層數組的特性,修改一個切片的元素可能會影響其他切片或原數組,具體取決于修改的位置是否在共享范圍內。理解這一機制對避免意外的副作用至關重要。
獲取Go函數的注釋
獲取Go語言的注釋主要用于自動化生成文檔(如通過godoc生成API文檔)、存儲代碼元數據(如Swagger規范的路由信息)、指導代碼生成工具(如go generate指令)、輔助靜態分析(如lint規則例外標記)以及標識測試示例,從而提升代碼可讀性、維護性及開發效率,實現文檔與代碼的同步更新。
下面這段代碼演示了如何使用 Go 的抽象語法樹 (AST) 解析工具來提取特定函數的注釋:
func main() {// 創建文件集fset := token.NewFileSet()dir, err := os.Getwd()if err != nil {panic(err)}// 解析當前文件f, err := parser.ParseFile(fset, "main.go", nil, parser.ParseComments)if err != nil {panic(err)}// 遍歷AST節點ast.Inspect(f, func(n ast.Node) bool {// 查找函數聲明fn, ok := n.(*ast.FuncDecl)if ok && fn.Name.Name == "TestFunc" {// 打印函數注釋if fn.Doc != nil {for _, comment := range fn.Doc.List {fmt.Println(comment.Text)}}}return true})
}// TestFunc
// @param null
// @return error
// @return int
func TestFunc() {}
輸出:
// TestFunc
// @param null
// @return error
// @return int
注意:Go 的文檔注釋 (//
或 /* */
) 需緊貼函數聲明。若注釋與函數之間有空行,則不會被關聯到 fn.Doc
。
Go 的 AST 解析工具提取特定函數的注釋,核心步驟包括:
- 解析文件生成 AST。
- 遍歷 AST 節點定位目標函數。
- 提取并打印注釋內容。
理解此代碼有助于實現自動化文檔生成、代碼分析等高級功能。
本篇結束~