在golang中将结构转换为字节数据,反之亦然

时间:2014-10-15 19:25:48

标签: go

我正在写一个Go程序,其中我只是使用 -

来确定服务器的响应
tr := &http.Transport{
        TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
    }
client := &http.Client{Transport: tr}
link := "address of server"
resp, err := client.Get(link)

现在我需要将resp转换为字节,以便我可以将其传递给某个函数,而另一方可以将其解码为相同的结构。 resp是http包中定义的http.Response类型的结构,我无法更改。

我想将其直接转换为字节。

golang中是否有任何我可以直接使用的功能,或者是否存在任何相同的功能。

5 个答案:

答案 0 :(得分:2)

您想使用go的库中的encode包。通常我喜欢JSON编码,因为它非常人性化,但是这个包支持多种格式的编码,包括二进制和gob,这是一种专为你想要做的设计的格式。

go documentation编码为json的示例:

package main

import (
    "encoding/json"
    "fmt"
    "os"
)

func main() {
    type ColorGroup struct {
        ID     int
        Name   string
        Colors []string
    }
    group := ColorGroup{
        ID:     1,
        Name:   "Reds",
        Colors: []string{"Crimson", "Red", "Ruby", "Maroon"},
    }
    b, err := json.Marshal(group)
    if err != nil {
        fmt.Println("error:", err)
    }
    os.Stdout.Write(b)
}

从json中解码的documentation示例:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    var jsonBlob = []byte(`[
        {"Name": "Platypus", "Order": "Monotremata"},
        {"Name": "Quoll",    "Order": "Dasyuromorphia"}
    ]`)
    type Animal struct {
        Name  string
        Order string
    }
    var animals []Animal
    err := json.Unmarshal(jsonBlob, &animals)
    if err != nil {
        fmt.Println("error:", err)
    }
    fmt.Printf("%+v", animals)
}

答案 1 :(得分:0)

这个怎么样?

bodyBytes, err := ioutil.ReadAll(response.Body)

您可以将其用作字节或简单地将ir转换为字符串,如此

bodyString := string(bodyBytes

答案 2 :(得分:0)

http.Response太过涉及无法转换为字节然后被恢复。 但是对于简单的struct,您可以考虑使用专为:

设计的gob
  

要通过网络传输数据结构或将其存储在文件中,必须对其进行编码,然后重新解码。

答案 3 :(得分:0)

我不确定是否误解了您的问题。但这是一个如何将结构转换为[] byte,反之亦然的示例。

package main

import "fmt"

func main() {
    type S struct{ s string }
    st := S{"address of server"}
    fmt.Printf("%T %v\n", st, st.s) //main.S test
    //convert struct to []byte
    sl := []byte(st.s)
    fmt.Printf("%T %v\n", sl, sl) //[]uint8 [97 100 ... 114]
    //convert []byte to struct
    s := fmt.Sprintf("%s", sl)
    st2 := S{s}
    fmt.Printf("%T %v\n", st2, st2.s) //main.S test
}

答案 4 :(得分:0)

DumpResponse软件包中的

net/http/httputil函数可能会有用。

https://pkg.go.dev/net/http/httputil#example-DumpResponse

文档提供了一个示例。