在 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 上打字很乏味,很抱歉它很笨拙
下面的代码,但简短的版本是我在结构中有一个 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 上打字很乏味,很抱歉它很笨拙