parsing - 如何将多个数据对象传递给 Golang 中的 HTML 模板

标签 parsing templates go interface

我将表的所有行作为 json 返回到变量 pdata 并将其解码为接口(interface)对象。 我有一个用户结构的实例,我想将其与未编码的 json 数据一起传递给渲染函数,并使用 html 模板中的字段参数 {{.fieldname}} 访问它。

if uuid != "" {
    pdata, err := getProduct()
    if err != nil {
        fmt.Println(err)
    } 

    type Prdata struct {
        Puid     string `json:"puid"`
        Pname    string `json:"pname"`
        Quantity string `json:"quantity"`
        Price    string `json:"price"`
        Image    string `json:"image"`
    }

    // Obj:= make(map[Prdata]string)

    var Pr Prdata

    err = json.Unmarshal(pdata , &Pr)
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(string(pdata))
    fmt.Println(Pr)
    fmt.Println(u)

    render(w, "internal", Pr)
}

fmt.Println(string(pdata)) 给出了这个输出

[{"image":"1Appleiphone7.jpeg","pname":"iphone7","price":"70000","puid":"d6742e4e-2ad6-43c5-97f4-e8a7b00684e2","quantity":"100"}]

我只成功地将数据解码为 interface{} 对象。尝试使用类型为 interface{} 的键和类型为 string 的值来制作 map ,但它会抛出错误:

"json: cannot unmarshal array into Go value of type map[interface {}]string"

render 函数接受类型为 interface{} 的参数

func render(w http.ResponseWriter, name string, data interface{})

fmt.Println(Pr) 给出了这个输出:

[map[quantity:100 image:1Appleiphone7.jpeg pname:iphone7 price:70000 puid:d6742e4e-2ad6-43c5-97f4-e8a7b00684e2]]

u 是结构 User

的一个实例
var u = &User{}

type User struct {
    Uuid     string            
    Username string           
    Password string           
    Fname    string            
    Email    string            
}

我可以使用管道 {{.}} 在 html 页面上看到输出。但是,我无法使用字段名访问任何数据。

一定有办法做到这一点。但我不确定如何?

当我传递以下类型的 json 时,我能够将它传递给结构类型并使用模板中的管道通过键值引用它。

    str := `{
    "image": "1Appleiphone7.jpeg",
    "pname": "iphone7",
    "price": "70000",
    "puid": "d6742e4e-2ad6-43c5-97f4-e8a7b00684e2",
    "quantity": "100"
    }`

解码函数

err = json.Unmarshal([]byte(str), &Pr)

DB记录pdata的json数据和上面的str的区别在于反引号“`”的使用。看起来json数据虽然显示的是键值对,但实际上是一个json数组,而不是json对象。有办法解决这个问题吗?

最佳答案

您不需要 map[interface{}]string 来解码 json obj。您的 json 相当于 map slice :

[
    {
        "image":"1Appleiphone7.jpeg",
        "pname":"iphone7",
        "price":"70000",
        "puid":"d6742e4e-2ad6-43c5-97f4-e8a7b00684e2",
        "quantity":"100"
    }
]

要解码的对象应该是一片带有字符串键和值的映射:

var Pr []map[string]string

Playground

顺便说一句,我相信那里隐藏着误解:

The render function takes an argument of the type interface{}

我的意思不是说您必须在那里传递 interface{} 类型的变量,而是说您可以将任何类型的变量传递给render函数。

关于parsing - 如何将多个数据对象传递给 Golang 中的 HTML 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41975647/

相关文章:

C++ - 为 std::array 迭代器的 std::array 创建别名

PHP 不解析双引号内的变量

c++ - 可变参数模板求和运算左关联

C 中的命令行参数整数错误检查

c++ - 类模板特化与模板

go - 取消引用指针的类型断言是 Go 中的内存写入吗?

Go 支持 Scatter-Gather IO 操作

go - 如何最好地保持一个长时间运行的 Go 程序运行?

c# - 如何优雅地将下面的文字解析成字典

python - 你如何使用 BeautifulSoup 从 HTML 'datacell' 中获取文本