当前位置: 首页 > news >正文

Go小技巧易错点100例(三十)

本期分享:

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 解析工具提取特定函数的注释,核心步骤包括:

  1. 解析文件生成 AST。
  2. 遍历 AST 节点定位目标函数。
  3. 提取并打印注释内容。

理解此代码有助于实现自动化文档生成、代码分析等高级功能。

本篇结束~

相关文章:

  • DEX平台引领风尚 XBIT让数字资产回归简单与透明
  • 乐视系列玩机------乐视pro3精英版-x722的一些刷机救砖教程与固件资源
  • Gateway网关:路由和鉴权
  • Android控件View、ImageView、WebView用法
  • QT 在圆的边界画出圆
  • Python打造智能化多目标车辆跟踪系统:从理论到实践
  • LeetCode 热题 100 70. 爬楼梯
  • python读取图片自动旋转的问题解决
  • 深入解析:删除有序数组中的重复项 II——巧用双指针实现条件筛选
  • 【Leetcode 每日一题 - 补卡】838. 推多米诺
  • 掌握流量管理:利用 EKS Ingress 和 AWS 负载均衡器控制器
  • 用户模块 - IP归属地技术方案
  • TCP/IP协议深度解析:从分层架构到TCP核心机制
  • MySQL 复合查询
  • Spring AMQP源码解析
  • 英伟达语音识别模型论文速读:Fast Conformer
  • MongoDB入门详解
  • \documentclass[lettersize,journal]{IEEEtran}什么意思
  • 【计算机视觉】三维重建:tiny-cuda-nn:高性能神经网络推理与训练的CUDA加速库
  • n8n中Wait节点的使用详解:流程暂停与恢复的实战指南
  • 茹诗瑶评《失去伊斯坦布尔》︱“帝国主义者”的多重面相
  • 库里22分赢下抢七大战,火箭十年难破“火勇大战”的魔咒
  • 国内外数十支搜救犬队伍齐聚三明,进行废墟搜救等实战
  • 市值增22倍,巴菲特30年重仓股盘点
  • 客流持续高位运行,长三角铁路计划增开153列旅客列车
  • 看纪录片抵学分,贺桂梅:纪录片是对抗低质碎片信息的好媒介