为了账号安全,请及时绑定邮箱和手机立即绑定

传递引用不更新字节数组

传递引用不更新字节数组

Go
慕斯王 2022-05-18 14:39:26
我正在尝试为我正在处理的 Lambda 项目找出内存文件操作。这个虚拟程序说明了我的无知:package mainimport (    "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]我错过了什么?
查看完整描述

2 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

*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 上的工作代码。


查看完整回答
反对 回复 2022-05-18
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

您缺少一行:


package main


import (

    "bytes"

    "fmt"

    "log"

)


// Using your function

func 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 approach

func 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 append

func 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))

}


查看完整回答
反对 回复 2022-05-18
  • 2 回答
  • 0 关注
  • 100 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号