在 Go 中编组多维数组

Marshalling multidimensional array in Go

下面的代码,但简短的版本是我在结构中有一个 uint8 的多维数组(切片)。我试图创建一个方法,我可以将任何结构转储到其中并将其写入文件,但是内部数组是......嗯,我不确定是否诚实。以下是一个更大的代码库的简洁版本,但明白了要点。我对 Go 比较陌生,所以也许它是关于类型转换的一些东西,我只是不知道。

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
)

type MyStruct struct {
    MyArray [][]uint8 `json:"arr"`
    Name    string    `json:"name"`
}

func CreateMyStruct(name string, size uint16, fill uint8) *MyStruct {
    var m [][]uint8
    var i, j uint16
    for i = 0; i < size; i++ {
        sl := []uint8{}
        for j = 0; j < size; j++ {
            sl = append(sl, fill)
        }
        m = append(m, sl)
    }

    return &MyStruct{
        MyArray: m,
        Name:    name,
    }
}

func main() {
    myStruct := CreateMyStruct("bobby", 4, 1)
    fmt.Printf("%+v\n", myStruct)
    str, _ := json.Marshal(myStruct)
    fmt.Printf("%+v\n", str)
    ioutil.WriteFile("my.json", str, 0644)
}

输出为:

$ go run test.go
&{MyArray:[[1 1 1 1] [1 1 1 1] [1 1 1 1] [1 1 1 1]] Name:bobby}
[123 34 97 114 114 34 58 91 34 65 81 69 66 65 81 61 61 34 44 34 65 81 69 66 65 81 61 61 34 44 34 65 81 69 66 65 81 61 61 34 44 34 65 81 69 66 65 81 61 61 34 93 44 34 110 97 109 101 34 58 34 98 111 98 98 121 34 125]
$ cat my.json
{"arr":["AQEBAQ==","AQEBAQ==","AQEBAQ==","AQEBAQ=="],"name":"bobby"}

显然,我期待这样的结果:

[[1,1,1,1]] // etc

在 Golang 中,[]byte[]uint8 的别名,json.Marshall[]byte 编码为 base64 编码的字符串(如您所见):

https://pkg.go.dev/encoding/json#Marshal

我怀疑解决方案是编写您自己的 JSON 编组器以根据需要生成 JSON。

包的文档中包含自定义编组器的示例:

https://pkg.go.dev/encoding/json#example-package-CustomMarshalJSON

此处:https://play.golang.org/p/N2K8QfmPNnc

在我的 phone 上打字很乏味,很抱歉它很笨拙