在切片末尾工作是否惯用?

2023-12-08

我正在阅读 Go 的compress/flate包,我发现了这段奇怪的代码[1]:

n := int32(len(list))
list = list[0 : n+1]
list[n] = maxNode()

在上下文中,list保证指向后面有更多数据的数组。这是一个私有函数,因此不能在库外部滥用。

对我来说,这似乎是一个可怕的黑客行为,应该是一个运行时异常。例如,以下 D 代码生成 RangeError:

auto x = [1, 2, 3];
auto y = x[0 .. 2];
y = y[0 .. 3];

滥用切片可以通过以下方式更简单(并且看起来更安全):

x := []int{1, 2, 3}
y = x[:2]
y = append(y, 4) // x is now [1, 2, 4] because of how append works

但这两种解决方案看起来都非常老套和可怕,恕我直言,不应该像它们那样工作。这种事情被认为是惯用的 Go 代码吗?如果是的话,以上哪一项是more惯用语?

[1] - http://golang.org/src/pkg/compress/flate/huffman_code.go#L136


这并不是滥用切片,这只是完美地利用了切片的含义:数组上的窗口。

我将从中获取这个插图我做的另一个相关答案 :

 array : [0 0 0 0 0 0 0 0 0 0 0 0]
 array :  <----   capacity   --->
 slice :     [0 0 0 0]
 slice :      <---- capacity ---> 

当数组大于切片时,当您知道不会超出底层数组时,通过扩展切片来获取更大的切片是正常和标准的(可以使用cap()).

关于您作为示例提供的错误代码,是的,它可能很危险,但是数组和切片是语言最基本的结构之一,如果您想避免此类错误,则必须在使用它们之前了解它们。我个人认为任何 Go 程序员不仅应该了解 API,还应该了解what是切片.


在您链接到的代码中,简短的分析表明,不可能存在溢出,因为list被创建为

list := make([]literalNode, len(freq)+1)

然后调整大小为count不能大于len(freq) :

list = list[0:count]

人们可能更喜欢多一些注释,但由于该函数包含list = list[0 : n+1]是私有的并且仅从一个地方调用,也可以认为注释冗长和代码晦涩之间的平衡听起来是正确的。有太多注释隐藏代码是很痛苦的,任何需要阅读此代码的人都可以像我一样轻松检查是否有溢出。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在切片末尾工作是否惯用? 的相关文章

  • Golang 基础知识 struct 和 new() 关键字

    我正在学习 golang 当我阅读描述结构的章节时 我遇到了初始化结构的不同方法 p1 passport var p2 passport p3 passport Photo make byte 0 0 Name Scott Surname
  • 投射回更专业的界面

    我正在用 Go 编写一个游戏 在 C 中 我将所有实体类存储在 BaseEntity 类的数组中 如果一个实体需要在世界中移动 那么它将是一个从 BaseEntity 派生的 PhysEntity 但添加了方法 我尝试模仿这是 go pac
  • 如何在golang模板上打印JSON?

    我需要在客户端有一个对象 所以我使用 json marshal 将其转换为 JSON 并将其打印到模板中 该对象被打印为转义 JSON 字符串 我期待它是var arr o1 o2 但它是var arr o1 o2 我知道我可以在客户端进行
  • Go 无法推断赋值中的类型:“non-name on left side of :=”

    该片段按预期工作play golang org p VuCl OKMav http play golang org p VuCl OKMav i 10 next 11 prev i i next 然而这个几乎相同的片段给出了non name
  • Go 的范围不能超过 (类型接口 {})

    我正处于尝试将我的注意力集中在 Go 上的婴儿阶段 目前 我正在模拟一个 API 请求 该请求返回包含对象数组的 JSON 格式的字符串 我试图找出迭代每个记录并访问每个字段的最合适的方法 最终 每个字段都将写入 Excel 电子表格 但现
  • 使用覆盖率信息测试 Go 中的 os.Exit 场景 (coveralls.io/Goveralls)

    这个问题 如何在 Go 中测试 os exit 场景 https stackoverflow com questions 26225513 how to test os exit scenarios in go 以及其中得票最高的答案 列出
  • 如何在 Go 中从 stdin 解析无限 json 数组?

    我正在尝试编写一个 i3status 的小替代品 一个与 i3bar 兼容的小程序进行通信this http i3wm org docs i3bar protocol html协议 他们通过标准输入和标准输出交换消息 两个方向的流都是一个无
  • 为什么 Go 中的函数不能命名为“init”?

    所以 今天在编码时我发现创建一个名为init产生错误method init not found 但是当我将其重命名为startup一切都很好 init 这个词是为 Go 中的某些内部操作而保留的 还是我在这里遗漏了一些东西 是的 该功能in
  • 与 Reflect.StructTag.Get 不兼容

    我当时在 Google Cloud 中工作 一切都很好 但是当我在 PC 中克隆所有项目时 每个 JSON 结构中都有此消息 结构体字段标签bson edad json edad omitempty 与reflect StructTag G
  • 尝试使用 pkg-config 但它不是注册命令

    好的 我已经在 Windows 8 下建立了整个 Go 开发环境 也使用了 MinGW 我正在使用LiteIde C Go bin go exe build C Users Alyx Go Hi pkg config cflags sdl
  • Go 算术中处理浮点数精度?

    我对 Go 中精确减去 2 个浮点数的方法感兴趣 我尝试过使用math big图书馆 但我无法得到准确的结果 我用过big js https github com MikeMcl big jsJavascript 库解决了这个问题 Go 算
  • 如何在 Docker 容器中持久保存 go 1.11 模块?

    我正在将 Go 1 10 应用程序迁移到 Go 1 11 这还包括从dep https golang github io dep to mod https github com golang go wiki Modules用于管理依赖关系
  • 如何避免 Google App Engine 标准环境中 Gorilla 会话的内存泄漏?

    我正在使用 Gorilla 在 Google App Engine 上启用会话变量 到目前为止 我只导入了 github com gorilla sessions 但 Gorilla 的页面显示 如果您不使用 gorilla mux 则需要
  • 如何将 json 字符串编组到 bson 文档以写入 MongoDB?

    我正在寻找的东西相当于文档 parse https api mongodb com java 3 2 org bson Document html parse java lang String 在golang中 这允许我直接从json创建b
  • 在Python中切片列表而不生成副本

    我有以下问题 给定一个整数列表L 我需要生成所有子列表L k for k in 0 len L 1 不生成副本 我如何在 Python 中完成这个任务 以某种方式使用缓冲区对象 简短的回答 对列表进行切片不会生成列表中对象的副本 它只是复制
  • 如何退出执行延迟调用的 go 程序?

    我需要使用defer释放手动创建的分配C图书馆 但我还需要os Exit在某个时刻具有非 0 状态 棘手的部分是os Exit跳过任何延迟指令 package main import fmt import os func main defe
  • 在 Go 中传递任意函数作为参数

    我正在尝试扩展我对 Go 函数指针的了解 并且我有一个问题 在 Go 中将函数作为参数传递可以做什么 不可以做什么 假设我想写一个decorator 可以包装任何现有函数的函数 为简单起见 我们将其限制为仅接受一个参数并仅返回一个值的函数
  • go install - 我需要手动更新我的路径吗?

    我对 Go 的最新最佳实践是什么有点困惑 在 macos 上安装最新的 1 17 Go 没有 GOPATH 环境变量 使用 go mod 我看到我的路径中有以下内容 usr local go bin 当我跑步时go install
  • Go中通过反射给struct成员赋值

    我有一个结构 v 其中包含成员 A B C 字符串 使用反射 我可以获得字段的名称及其值 typ v Type for i 0 i lt v NumField i gets us a StructField fi typ Field i f
  • 使用结构解析 YAML

    我创建了以下 YAML 文件来提供用户需要提供的一些配置 Environments sys1 models app type app1 service type fds app type app2 service type era sys2

随机推荐

  • 存储 Redis 密钥的最佳方式

    我使用 Redis 来存储一些信息并检测这些信息随时间的变化 例如 考虑用户和位置 使用更长或更短的键名有什么价值 使用更长的键更清晰 但是使用更长的键名会带来很大的内存或性能成本吗 以下是示例 SET L 123456
  • 如何为 tomcat-maven-plugin 配置附加上下文路径?

    我使用 Maven 3 0 3 和 Tomcat 插件 我想使用 Maven 和 Tomcat 部署该网站的嵌入式实例 我的问题是如何在嵌入式 Tomcat 服务器中配置附加上下文路径 下面是我的 Tomcat 配置 但是我的
  • python unittest 的 setUp 函数不使用在类上声明的模拟

    所以我正在编写单元测试 但我在设置函数方面遇到了问题 据我所知 它应该在函数之前执行代码 因此我可以将任何重复的内容放在那里 然而 这个函数似乎并没有将我创建的模拟应用为整个类的补丁装饰器 这是我希望它看起来像的一小部分 patch geo
  • Java MySQL的executeUpdate()对于INSERT ON ON DUPLICATE KEY UPDATE返回什么?

    我在网上查了大约3个小时 仍然找不到这个问题的答案 爪哇文档还有这个tutorial says 返回 1 SQL 数据操作语言的行计数 DML 语句或 2 0 表示不返回任何内容的 SQL 语句 那么这意味着 插入 1 行无重复项 gt 1
  • 尽管已安装,但未找到底图数据雇用

    我和这个帖子有同样的问题 使用辅助脚本中的导入来声明 var 可由另一个函数使用 但答案在我这边不起作用 对于上下文 basemap and basemap data hires已安装 但使用时resolution f 它会触发以下错误 O
  • 将 MJPEG 流式传输到文件,但仅保留最后 x 分钟

    我希望在检测到运动时记录 MJPEG 流 但我的运动检测通知比运动发生晚了几秒钟 为了解决这个问题 我想一直录制 但只保留最后 2 分钟的镜头 现在我正在使用 cURL 无限下载 但我一直在思考如何让它将文件的前面正确地修剪为 2 分钟 L
  • 纯CSS棋盘,带有div且没有类或id,可能吗?

    我有以下布局 div div div div div div div div div div div div div div div div div div div div div div div div div div div div d
  • 通知操作图标未显示

    我尝试在 Android 中显示通知 并使用来自这个链接 在一些消息来源中 人们说图标应该是全白色的 而一些消息来源说我应该使用 png代替vector 我尝试了所有这些方法 但没有人帮助我 我尝试这段代码 Notification new
  • 搜索数据库 JavaScript

    我已经消除了所有语法错误 但无法检索任何数据 任何帮助将不胜感激 db 变量存储我正在查找的视频数组 它是一个单独的 js 文件 数据库 var db JavaScript Version History http http wddbs c
  • 有人可以帮我使用 livestream 的 api 发出跨域 xml 请求吗?

    我正在尝试使用 livestream 非常有用的移动 api 位于http www livestream com userguide title Mobile API Requesting a mobile stream发出 xml 请求
  • 如何在 django 中为每个模型关联多种类型的标签

    我对 django 不太陌生 并试图找到最好的方法来做事 而不是自己编写所有内容 我正在开发一个模型 其中需要将多种类型的标签与模型关联 然后我想使用多个过滤条件检索对象 我看到在 django tagging 中 标签是按模型存储的 所以
  • 当两个应用程序都使用嵌入式 activemq 时,如何将 Jms 消息从一个 spring-boot 应用程序发送到另一个应用程序

    我有两个 spring boot 应用程序 在接收器应用程序的 Application java 中我有 Bean public JmsListenerContainerFactory
  • 在 WebAPI 中将 HttpResponseMessage 作为 excel 文件返回的问题

    我创建了 WebAPI 它使用 closexml nuget 返回一个 excel 文件 基本上它改变了我的DataTable脱颖而出 我指的是下面的几个链接 如何在 ASP NET WebAPI 中返回文件 FileContentResu
  • 在 Flutter 中访问 Firebase 存储

    我对 Flutter 相当陌生 以前从未使用过 Firebase 所以如果有明显的解决方案 我深表歉意 我正在开发一个 Flutter 应用程序 其中涉及记录表单提交并将其提交到中央位置 Firebase Storage 似乎很合适 因为据
  • 获取 GeoPandas 中几何图形之间的交集计数

    是否可以使用 GeoPandas 对象获取两个几何图形之间的交集计数 也就是说 我想计算一个 GeoDataFrame 中与另一个 GeoDataFrame 中的每个多边形相交的多边形或线串的数量 在浏览 GeoPandas 文档时 我没有
  • 寻找 C# 注册表类 [已关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 寻找包装调用以执行以下操作的 C 类 读取和写入键值 读取和写入密钥条目 枚举键中的条目 这个很重要 例如 需要列出以下位置的所有条目 HKEY L
  • 如何使用装饰器将变量注入作用域?

    免责声明 可能有更多的Python方式来做我想做的事情 但我想知道Python的作用域在这里是如何工作的 我正在尝试找到一种方法来制作一个装饰器 该装饰器可以执行诸如将名称注入另一个函数的作用域之类的操作 这样该名称就不会泄漏到装饰器的作用
  • 根据参考重新排序多索引数据框列

    我有一个多索引数据框 其名称附加到列级别 数据表看起来像这样 df1 TIME TMC 111N1 111P2 111N3 111P4 DATE EPOCH 0 143 113 103 NaN 1 183 NaN NaN NaN 2 NaN
  • CodeIgniter 与 PHPExcel 致命错误无法重新声明类 IOFactory

    我正在尝试将 PHPExcel 与 CodeIgniter 一起使用 我的问题是当我想使用下面的方法时 我得到了PHP 致命错误 无法重新声明类 IOFactory 如果您不确定文件类型 则可以在使用 createReader 方法实例化读
  • 在切片末尾工作是否惯用?

    我正在阅读 Go 的compress flate包 我发现了这段奇怪的代码 1 n int32 len list list list 0 n 1 list n maxNode 在上下文中 list保证指向后面有更多数据的数组 这是一个私有函