首页 > 解决方案 > 在 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

标签: jsongoio

解决方案


在 Golang[]byte中是一个别名[]uint8json.Marshall编码[]byte为 base64 编码的字符串(如您所见):

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

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

包的文档中包含一个自定义 Marshaller 的示例:

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

这里: https: //play.golang.org/p/N2K8QfmPNnc

在我的手机上打字很乏味,所以道歉它很hacky


推荐阅读