传递引用不更新字节数组

我正在尝试为我正在处理的 Lambda 项目找出内存文件操作。这个虚拟程序说明了我的无知:


package main


import (

    "bytes"

    "fmt"

    "log"

)


func Append(input *[]byte, appendee string) (err error)  {

   buf := bytes.NewBuffer(*input)

   if _, err := buf.WriteString(appendee); err != nil {

       log.Println(err)

   } 


   return err

}



func main() {

   test := "this is a test\nThis test is short\nBut longer tests would work also\n"


   b := []byte(test)


   fmt.Println(b)


   err := Append(&b, "This is an appended line")


   if err != nil {

           fmt.Println("oops")

   }


   fmt.Println(b)

}

我希望 y 在调用 Append 的行中传递对字节数组的引用,该函数可以操作与 main 中的相同数据结构,然后打印将包括附加的行。但事实并非如此。这是执行:


✗ go run test.go

[116 104 105 115 32 105 115 32 97 32 116 101 115 116 10 84 104 105 115 32 116 101 115 116 32 

105 115 32 115 104 111 114 116 10 66 117 116 32 108 111 110 103 101 114 32 116 101 115 116 

115 32 119 111 117 108 100 32 119 111 114 107 32 97 108 115 111 10]

[116 104 105 115 32 105 115 32 97 32 116 101 115 116 10 84 104 105 115 32 116 101 115 116 32 

105 115 32 115 104 111 114 116 10 66 117 116 32 108 111 110 103 101 114 32 116 101 115 116 

115 32 119 111 117 108 100 32 119 111 114 107 32 97 108 115 111 10]

我错过了什么?


慕斯王
浏览 101回答 2
2回答

繁花不似锦

*input = buf.Bytes()你之前return err在Append功能中失踪了func Append(input *[]byte, appendee string) (err error) {    buf := bytes.NewBuffer(*input)    if _, err := buf.WriteString(appendee); err != nil {        log.Println(err)    }    *input = buf.Bytes()    return err}看看 go playground 上的工作代码。

回首忆惘然

您缺少一行:package mainimport (    "bytes"    "fmt"    "log")// Using your functionfunc Append(input *[]byte, appendee string) error {    buf := bytes.NewBuffer(*input)    if _, err := buf.WriteString(appendee); err != nil {        log.Println(err)        return err    }    // You are missing this one    *input = buf.Bytes()    return nil}// Using another approachfunc Append2(input *[]byte, a string) {    sb := []byte(a)    *input = append(*input, sb...)}// As pointed by @cerise-limón, is no necessary to perform type conversion from string to byte during the appendfunc Append3(input *[]byte, a string) {    *input = append(*input, a...)}func main() {    var (        test     string = "this is a test\nThis test is short\nBut longer tests would work also\n"        toAppend string = "This is an appended line\n"    )    b := []byte(test)    fmt.Println(b)    if err := Append(&b, "1) "+toAppend); err != nil {        fmt.Printf("oops: %s\n", err.Error())    }    fmt.Println(string(b))    Append2(&b, "2) "+toAppend)    fmt.Println(string(b))    Append3(&b, "3) "+toAppend)    fmt.Println(string(b))}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go