在Go中,要访问的元素string
,我们可以编写:
str := "text"
for i, c := range str {
// str[i] is of type byte
// c is of type rune
}
访问时str[i]
,Go会执行从rune
到的转换byte
吗?我猜答案是肯定的,但我不确定。如果是这样,那么以下哪种方法在性能方面更好?一个人是否比另一个人更可取(例如,按照最佳实践)?
str := "large text"
for i := range str {
// use str[i]
}
要么
str := "large text"
str2 := []byte(str)
for _, s := range str2 {
// use s
}
以下哪种方法在性能方面更好?
绝对不是这个。
str := "large text"
str2 := []byte(str)
for _, s := range str2 {
// use s
}
字符串是不可变的。[]byte
易变。这意味着[]byte(str)
制作副本。因此,上面将复制整个字符串。我发现不知道何时复制字符串是大型字符串性能问题的主要根源。
如果str2
永不更改,则编译器 可以 优化副本。因此,最好像上面这样写,以确保字节数组不会被更改。
str := "large text"
for _, s := range []byte(str) {
// use s
}
这样一来,str2
以后就不可能修改并破坏优化。
但这是一个坏主意,因为它将破坏任何多字节字符。见下文。
至于字节/符文转换,由于性能不相等,因此不考虑性能。c
将是一个符文,str[i]
将是一个字节。如果您的字符串包含多字节字符,则必须使用符文。
例如…
package main
import(
"fmt"
)
func main() {
str := "snow ☃ man"
for i, c := range str {
fmt.Printf("c:%c str[i]:%c\n", c, str[i])
}
}
$ go run ~/tmp/test.go
c:s str[i]:s
c:n str[i]:n
c:o str[i]:o
c:w str[i]:w
c: str[i]:
c:☃ str[i]:â
c: str[i]:
c:m str[i]:m
c:a str[i]:a
c:n str[i]:n
请注意,使用str[i]
会破坏多字节Unicode雪人,它仅包含多字节字符的第一个字节。
无论如何,没有性能差异,因为range str
必须逐个字符地进行工作,而不是逐字节进行。
如何将字符串(字节字符串)转换为字节(字节字符串),而不必手动复制和粘贴字符串并在其前面放置b?
问题内容: 我想在GO中将字符串数组转换为字节数组,以便可以将其写到磁盘上。将字符串数组()解码为字节数组()的最佳解决方案是什么? 我正在考虑对字符串数组进行两次迭代,第一个迭代以获得字节数组所需的实际大小,然后第二个迭代写入每个元素的长度和实际字符串()。 解决方案必须能够以其他方式进行转换;从一个到一个。 问题答案: 让我们忽略一个事实,那就是走一秒钟。您需要做的第一件事是将序列化格式编组为
问题内容: 有没有办法像这样转换HTML: 或任何其他HTML字符串插入DOM元素?(以便我可以使用appendChild())。我知道我可以执行.innerHTML和.innerText,但这不是我想要的-我确实希望能够将动态HTML字符串转换为DOM元素,以便可以在.appendChild()中传递它。 更新:似乎有些混乱。我将HTML内容放在字符串中,作为JavaScript中变量的值。该文
问题内容: 我正在使用以下代码从外部程序获取标准输出: 方法返回一个字节数组: 但是,我想将输出作为普通的字符串使用。这样我就可以像这样打印它: 我认为这就是方法的用途,但是当我尝试使用它时,我又得到了相同的字节数组: 如何将字节值转换回字符串?我的意思是,使用”batteries”而不是手动进行操作。我希望它与Python 3兼容。 问题答案: 你需要解码bytes对象以产生一个字符串:
问题内容: 有没有办法像这样转换HTML: 或任何其他HTML字符串插入DOM元素?(以便我可以使用appendChild())。我知道我可以执行.innerHTML和.innerText,但这不是我想要的- 我确实希望能够将动态HTML字符串转换为DOM元素,以便可以在.appendChild()中传递它。 更新:似乎有些混乱。我将HTML内容放在字符串中,作为JavaScript中变量的值。该