当前项目要求我获取一个 struct (带有注释标记),并将数据作为平面文件写入.该文件是一个柱状文件,因此数据的定位非常重要.这些位置和长度在字段级别的my struct标记中设置.

我遇到的问题是,我正在将指向[]字节结果片的指针传递给我的函数,但无论我做什么,原始片都没有包含数据.下面是一个简单的示例代码,演示了我正在做的事情.

package main

import (
    "fmt"
    "strconv"
)

func writeInt(value int, fieldData *[]byte, col, length int) {
    v := fmt.Sprintf("%+0" + strconv.Itoa(length) +"d", value)
    copyData(fieldData, v, col, length)
}

func writeString(value string, fieldData *[]byte, col, length int) {
    v := fmt.Sprintf("%-" + strconv.Itoa(length) + "s", value)
    copyData(fieldData, v, col, length)
}

func copyData(fieldData *[]byte, v string, col, length int) {
    data := *fieldData
    if len(data) < col + length {
        temp := make([]byte, col + length - 1)
        copy(temp, data)
        data = temp
    }
    copy(data[col - 1:length], v)
    fieldData = &data
}

func main() {
    var results []byte

    writeInt(13, &results, 1, 3)
    writeString("TEST", &results, 4, 10)

    fmt.Print(results)

}

预期结果(作为字符串)应为:

'013TEST      ' - zero pad in front of int and space pad behind string

但我得到了【】

我是完全错误地看待这一点,还是我只是不理解某些东西?

推荐答案

Note beforehand:不要使用指向切片的指针(切片已经是指向支持数组的小标题).您可以在不使用指针的情况下修改元素,如果需要修改标题(例如,向标题添加元素),请返回新的切片,就像内置的append()一样.

此外,你try 做的是更容易实现的bytes.Buffer型.它实现io.Writer,您可以直接写入它(甚至使用fmt.Fprint()),并以[]bytestring的形式获取其内容.


每个参数都是传递值的副本.修改参数只会修改此副本.

如果你这样做:

fieldData = &data

尽管fieldData是一个指针,但您只是在修改副本.必须修改pointed值:

*fieldData = data

打印结果:

fmt.Println(results)
fmt.Printf("%q\n", string(results))

输出(在Go Playground上try ):

[43 49 51 84 69 83 84 32 32 32 0 0 0]
"+13TEST   \x00\x00\x00"

Go相关问答推荐

如何模拟嵌入. FS?

如何使用Docker Compose配置Go,使main. go文件位于/CMD文件夹中

有没有办法让sqlc生成可以使用pgxpool的代码

用 fork 替换 Go 依赖:...用于两个不同的模块路径

为什么 mux.Vars() 返回空的 map[]

如何使用gosdk在Dynamodb中进行UpdateItem时,将ValueBuilder对象声明为StringSet类型?

使用goroutines在Golang中验证 struct

io.Reader 无限循环与 fmt.Fscan

为什么docall在singleflight中使用go panic?

将 struct 转换为 CSV 字符串

如何使用管理员权限启动 powershell 进程并重定向标准输入 (os.exec)

无法使用 gocsv 读取引用字段

设置指向空接口的指针

如何在 golang revel 中获取动态应用程序配置

如何在没有内存分配的情况下压缩和发布文件

在 connect-go 拦截器中修改响应体

如何在循环中旋转图像以便在 golang 中创建 GIF?

在 Go 中将十六进制转换为带符号的 Int

如何使用 httputil.ReverseProxy 设置 X-Forwarded-For

手动下载并放置一个 golang mod 文件