这个Go方法是否“分配新内存”?
(我正在使用 Donovan 和 Kernighan 的The Go Programming Language学习 Go 。这个问题的答案对其他人来说可能是显而易见的,但我很难过,不知道从哪里开始。)
作为GOPL 中的一个练习,作者要求读者修改他们的reverse程序(将ints的切片原地反转)“以原地反转[]byte表示 UTF-8 编码字符串的切片的字符”(93)。他们补充说:“你能在不分配新内存的情况下做到这一点吗?”
简而言之,我想问以下是否分配了新内存。根据打印语句的结果,我认为它没有,但我不确定。另一种让我感到困惑的reverse方法是:如果该方法就地反转,我希望它不会分配新的内存。所以,我假设我一定遗漏了一些东西,因为他们要求方法就位,然后增加不分配新内存的挑战。他们是在催促我避免我做过的事情吗?这里是否有一些额外的技巧值得了解内存分配(在 Go 中或一般情况下)?
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
phrase := "Hello, ??!"
fmt.Printf("Before reverse:tmemory address %p => phrase: %sn", &phrase, phrase)
phrase = string(reverseByRune([]byte(phrase)))
fmt.Printf("After reverse:tmemory address %p => phrase: %sn", &phrase, phrase)
}
func reverseByRune(b []byte) []byte {
for i := 0; i < len(b); {
_, size := utf8.DecodeRune(b[i:])
reverse(b[i : i+size])
i += size
}
reverse(b)
return b
}
func reverse(b []byte) []byte {
for i, j := 0, len(b)-1; i < j; i, j = i+1, j-1 {
b[i], b[j] = b[j], b[i]
}
return b
}
这是 Go Playground:https : //play.golang.org/p/Qn7nYXLGoQn。
PS 我只能投赞成票并接受一次,但如果有人想要额外的感谢,我会喜欢任何有关内存分配的链接(尤其是在 Go 中)。