我已经看到了三种将内容写入HTTP响应的方法:
func Handler(w http.ResponseWriter, req *http.Request) {
io.WriteString(w, "blabla.\n")
}
Run Code Online (Sandbox Code Playgroud)
和:
func Handler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("blabla\n"))
}
Run Code Online (Sandbox Code Playgroud)
还有:
fmt.Fprintf(w, "blabla")
Run Code Online (Sandbox Code Playgroud)
他们之间有什么区别?哪一个更喜欢使用?
让我们转换string为[]byte:
func toBytes(s string) []byte {
return []byte(s) // What happens here?
}
Run Code Online (Sandbox Code Playgroud)
这个演员阵营有多贵?正在进行复制吗?就我在Go规范中看到的那样:字符串的行为类似于字节切片但是不可变,这至少应该涉及复制以确保后续切片操作不会修改我们的字符串s.反向对话会发生什么?[]byte <-> string会话是否涉及编码/解码,如utf8 < - >符文?
所以很容易将a解码[]byte为a []rune(简单地转换为string,然后转换为[]rune非常好的工作,我假设它默认为utf8并且使用填充字节用于invalids).我的问题是 - 你怎么想把它解码[]rune回[]byteutf8形式?
我错过了什么或者我是否已经为我的每一个符文手动调用EncodeRune[]rune?当然有一个编码器,我可以简单地传递Writer给.
根据https://blog.golang.org/strings和我的测试,看起来当我们range是一个字符串时,我们得到的字符是rune类型,但是如果我们通过 获取它str[index],它们将是byte类型,这是为什么呢?
我正在尝试string使用utf8库有效地计算 utf-8中的符文。此示例是否最佳,因为它不复制基础数据?
https://golang.org/pkg/unicode/utf8/#example_DecodeRuneInString
func main() {
str := "Hello, ??" // let's assume a runtime-provided string
for len(str) > 0 {
r, size := utf8.DecodeRuneInString(str)
fmt.Printf("%c %v\n", r, size)
str = str[size:] // performs copy?
}
}
Run Code Online (Sandbox Code Playgroud)
我在(不安全的)反射库中找到了StringHeader。这是stringGo中 a 的确切结构吗?如果是这样,可以想象,对字符串进行切片只是更新Data或分配一个新的字符串StringHeader。
type StringHeader struct {
Data uintptr
Len int
}
Run Code Online (Sandbox Code Playgroud)
奖励:在哪里可以找到执行string切片的代码,以便我可以自己查找?有这些吗?
https://golang.org/src/runtime/slice.go
https://golang.org/src/runtime/string.go
该相关SO答案,从转化时表明运行时字符串招致拷贝string到[]byte。
Go类型转换在内部如何工作?
类型转换的内存利用率是多少?例如:
var str1 string
str1 = "26MB string data"
byt := []byte(str1)
str2 := string(byt)
Run Code Online (Sandbox Code Playgroud)
每当我键入转换任何变量时,它将消耗更多的内存吗?
我对此很担心,因为当我尝试解组时,会出现“ 致命错误:运行时:内存不足 ”
err = json.Unmarshal([]byte(str1), &obj)
Run Code Online (Sandbox Code Playgroud)
str1值来自HTTP响应,但使用ioutils.ReadAll读取,因此它包含完整的响应。
我已经阅读了关于“ https://github.com/golang/go/issues/25484 ”关于从[]byteto 的无复制转换string。
我想知道是否有办法将字符串转换为没有内存复制的字节片?
我正在编写一个处理 terra 字节数据的程序,如果每个字符串在内存中复制两次,则会减慢进度。而且我不关心可变/不安全,只关心内部使用,我只需要尽可能快的速度。
例子:
var s string
// some processing on s, for some reasons, I must use string here
// ...
// then output to a writer
gzipWriter.Write([]byte(s)) // !!! Here I want to avoid the memory copy, no WriteString
Run Code Online (Sandbox Code Playgroud)
所以问题是:有没有办法防止内存复制?我知道也许我需要 unsafe 包,但我不知道如何。我已经搜索了一段时间,直到现在还没有答案,SO 也没有显示相关的答案有效。