gpt4 book ai didi

Golang bytes.Buffer - 传递值问题

转载 作者:IT王子 更新时间:2023-10-29 02:20:37 27 4
gpt4 key购买 nike

下面的 golang(go1.10.2) 代码会给出意想不到的输出

package main

import (
"bytes"
"fmt"
)

func main() {
var b bytes.Buffer
//Commenting the below line will fix the problem
b.WriteString("aas-")
fmt.Printf("Before Calling - \"%s\"\n", b.String())
b = makeMeMad(b)
fmt.Printf("FinalValue - \"%s\"\n", b.String())
}

func makeMeMad(b bytes.Buffer) bytes.Buffer {
b.WriteString("xcxxcx asdasdas dasdsd asdasdasdasd")
fmt.Printf("Write More - \"%s\"\n", b.String())

/*
//This will fix the problem
var newBuffer bytes.Buffer
newBuffer.WriteString(b.String())
return newBuffer
*/
return b
}

输出

Before Calling - "aas-"
Write More - "aas-xcxxcx asdasdas dasdsd asdasdasdasd"
FinalValue - "aas- "

我在最后一行输出中期待“aas-xcxxcx asdasdas dasdsd asdasdasdasd”。谁能解释一下。

最佳答案

在引擎盖下 bytes.Buffer 包含其他未导出的字段 bootstrap 数组和 buf slice 。而缓冲区内容是小 slice 指向内部数组以避免分配。当您将 bytes.Buffer 参数作为值传递时,函数会收到一个副本。 slice 是引用类型,所以这个副本的 slice 继续指向原始缓冲区的数组。当你写入这个副本的 slice 时,你实际上是在写入原始的 Bootstrap 数组,副本的数组保持不变(在我们的例子中是“aas-”)。然后你返回这个副本,你可以打印它。但是,当您将其分配给包含原始变量的变量时, Bootstrap 数组首先分配(“aas-”)然后 buf slice 指向它。Bootstrap 数组是 [64] 字节,因此您可以在代码片段中使用长字符串文字 >64 和 see当缓冲区分配 buf slice 时,事情按预期工作。还有 here试图说明为什么所有这些看起来如此有规律的简化示例。

关于Golang bytes.Buffer - 传递值问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51419111/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com