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

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. 提取并打印注释内容。

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

本篇结束~

http://www.xdnf.cn/news/4069.html

相关文章:

  • 算法刷题篇
  • 基于Redis实现优惠券秒杀——第3期(分布式锁-Redisson)
  • UniGetUI 使用指南:轻松管理 Windows 软件(包括CUDA)
  • 【Springboot知识】Springboot计划任务Schedule详解
  • 前端懒加载(Lazy Loading)实战指南
  • 旋转图像(中等)
  • RPC是什么
  • Linux文件复制命令精要指南:cp与scp详解
  • Three.js + React 实战系列 - 客户评价区细解教程 Clients 组件✨(回答式评价 + 评分星级)
  • 51c大模型~合集124
  • TS 类型兼容性
  • 乡村饮用水厂无线网络规划与设计:融合 LoRaWAN、5G、Mesh 的分层异构方案
  • unity TMP字体使用出现乱码方框
  • 最长回文子串(动规 + 中心拓展)
  • 反转字符串2
  • 杰理-JL701-充电开机,芯片不进入休眠
  • Spring Boot 中 @Bean 注解详解:从入门到实践
  • 无人机 | 无人机设计概述
  • Springclound常用五大组件及其使用原理
  • 防止交叉验证中的数据泄露:提升模型在实际环境中的性能
  • 怎样获得真实带宽之宽带升级后
  • 014枚举之指针尺取——算法备赛
  • C++类与对象深度解析:从基础到应用
  • kotlin 01flow-StateFlow 完整教程
  • Python-numpy中ndarray对象创建,数据类型,基本属性
  • 【免费分享无广告】刷视频助手抖音快手小红书视频号自动脚本刷视频养号
  • 前端面试每日三题 - Day 25
  • Netty的内存池机制怎样设计的?
  • 专业化婴幼儿托育服务与管理实训室建设方案
  • Easy云盘总结篇-回收站