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语言的注释主要用于自动化生成文档(如通过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)
}
}
}
returntrue
})
}
// TestFunc
// @param null
// @return error
// @return int
func TestFunc() {
}
输出:
// TestFunc
// @param null
// @return error
// @return int
注意:Go 的文档注释 (//
或 /* */
) 需紧贴函数声明。若注释与函数之间有空行,则不会被关联到 fn.Doc
。
Go 的 AST 解析工具提取特定函数的注释,核心步骤包括:
理解此代码有助于实现自动化文档生成、代码分析等高级功能。
本篇结束~