Go 葛朗:哪种方式更有效地使用;“适用于范围”; 类型路径[]字节 func(p路径)ToUpper(){ 对于i,b:=范围p{ 如果“a”

Go 葛朗:哪种方式更有效地使用;“适用于范围”; 类型路径[]字节 func(p路径)ToUpper(){ 对于i,b:=范围p{ 如果“a”,go,Go,前者有更多的内存操作,即在b上:它在循环的第一次运行中被分配,并且除了i之外,在每个后续运行中被重新分配,原始切片被修改,而在第二个示例中,只有i被分配和重新分配,并用于修改原始切片切片。但前者的边界检查也较少,而且b可能永远不会离开寄存器。如果不对生成的程序集进行基准测试和/或检查,您就不能做出任何假设。@JimB:感谢您的输入–同样,拆分“假设”的含义这是真的。既然你很友好,没有投我反对票,如果可能的话,我会亲自做这件事作为一种忏悔。仅供参考,在我的go1.6机器上,前者的速度要快得多 ty

前者有更多的内存操作,即在
b
上:它在循环的第一次运行中被分配,并且除了
i
之外,在每个后续运行中被重新分配,原始切片被修改,而在第二个示例中,只有
i
被分配和重新分配,并用于修改原始切片切片。

但前者的边界检查也较少,而且b可能永远不会离开寄存器。如果不对生成的程序集进行基准测试和/或检查,您就不能做出任何假设。@JimB:感谢您的输入–同样,拆分“假设”的含义这是真的。既然你很友好,没有投我反对票,如果可能的话,我会亲自做这件事作为一种忏悔。仅供参考,在我的go1.6机器上,前者的速度要快得多
type path []byte

func (p path) ToUpper() {
    for i, b := range p {
        if 'a' <= b && b <= 'z' {
            p[i] = b + 'A' - 'a'
        }
    }
}
func (p path) ToUpper() {
    for i, _ := range p {
        if 'a' <= p[i] && p[i] <= 'z' {
            p[i] = p[i] + 'A' - 'a'
        }
    }
}