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 进行修改。

10-08 14:01