我正在阅读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代码吗?如果是这样,以上哪一项 更
惯用?
[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()
)。
以您的错误代码为例,是的,这很危险,但是数组和切片是语言的最基本结构之一,如果要避免此类错误,必须在使用它们之前先了解它们。我个人认为,任何去编码器不应该只知道API,而且
什么 是切片
。
在您链接到的代码中,简短的分析表明,不可能像list
创建时那样发生溢出。
list := make([]literalNode, len(freq)+1)
并在以后调整为count
不能大于len(freq)
:
list = list[0:count]
可能还希望再添加一些注释,但是由于包含的函数list = list[0 : n+1]
是私有的,并且只能从一个地方调用,因此也可以认为注释详细程度和代码晦涩度之间的平衡听起来不错。隐藏太多的注释会隐藏代码,这很痛苦,需要阅读此代码的任何人都可以像我一样轻松地检查是否没有溢出。
在Go中,复制切片是标准费用,如下所示: 在《铁锈》中,我找不到类似的替换方法。我想到的东西是这样的: 不幸的是,我遇到了无法解决的编译错误: 如何设置?有没有更好的复制切片的方法?
问题内容: 在Golang中,和之间有什么区别? 我发现这两种方法都可行,但是哪一种更好? 问题答案: 除了fabriziom的答案外,您还可以在“转到切片:用法和内部方法”中看到更多示例,其中提到了的用法: 由于slice()的零值就像 零长度的slice一样 ,您可以声明slice变量,然后在循环中附加到该变量: 这意味着,要附加到切片,您不必先分配内存:切片足以作为要添加的切片。
问题内容: 我想知道是否有人可以使用空白HTML表单操作将其发布回当前页面,从而给出“最佳实践”响应。 问题答案: 您可以做的最好的事情就是完全忽略action属性。如果您不填写表格,表格将被提交到文档的地址,即同一页面。 也可以将其保留为空,并且任何实现HTML表单提交算法的浏览器都将其视为等同于文档的地址,这主要是因为浏览器当前的工作方式是: 让action作为Submitter元素的acti
问题内容: 我试图用goroutines写一个简单的工作池。 我写的代码是惯用的吗?如果没有,那应该改变什么? 我希望能够将工作线程的最大数量设置为5,并在所有5个忙时都阻塞直到工作线程可用。我如何将其扩展为最多只能容纳5个工人?我是否会生成5个静态goroutine,并给它们每个? 码: 问题答案: 从任何意义上讲,您的解决方案都不是工作程序goroutine池:您的代码不会限制并发的gorou
问题内容: 我想知道我什么时候做类似的事情 创建新字符串或返回视图/迭代器 问题答案: Python会进行逐个切片,这意味着每次切片时(非常琐碎的切片(例如)除外),它都会将所有数据复制到一个新的字符串对象中。 根据一位开发人员的说法,之所以做出此选择是因为 [按引用切片]方法更复杂,更难实现并且可能导致意外行为。 例如: 使用“按切片复制”设计,可以立即释放字符串。尽管您只对第一个字符感兴趣,但
问题内容: 当尝试在切片指针上移动时,我一直收到此错误。 我究竟做错了什么? 这是结构: 这是Class结构: 问题答案: 您假设指向切片的指针将在迭代时自动取消引用。 事实并非如此,没有理由,因为切片已经是一种指针,从而使指向切片的指针完全无用。 从有效出发: 如果函数采用slice参数,则对slice元素所做的更改将对调用者可见,这类似于将指针传递给基础数组。 在内部,切片是由 指向基础数组中