type path []byte
func (p path) ToUpper() {
for i, b := range p {
if 'a' <= b && b <= 'z' {
p[i] = b + 'A' - 'a'
}
}
}
在上面(此示例是“The Go Blog”的副本)中,如果ToUpper如下更改:
func (p path) ToUpper() {
for i, _ := range p {
if 'a' <= p[i] && p[i] <= 'z' {
p[i] = p[i] + 'A' - 'a'
}
}
}
这样会更有效
为什么?
“围棋博客”对前一个说:
“在这里,ToUpper方法在for range构造中使用两个变量来捕获索引和 slice 元素。这种形式的循环避免了在体内多次写入p [i]。”
什么意思
最佳答案
前者具有更多的内存操作,即在b
上进行操作:除i
之外,它在循环的第一轮中分配并在随后的每次运行中重新分配,并且原始 slice 被修改,而在第二个示例中,仅i
分配并重新分配并用于对原始 slice 进行修改。