Golang新手问题:如何在一个切片/数组中存储2种结构体

Golang新手问题:如何在一个切片/数组中存储2种结构体 我正在尝试用Go构建一个基本的Web应用程序。我使用以下代码执行模板:

t.Execute(w, someArray)

someArray包含某种结构体类型。但现在我需要传递多个切片/数组。我在考虑将两个数组合并到一个数组中,但没能成功实现。我的大脑可能已经停止运转了。在写这个问题时我意识到这是个愚蠢的问题。我该怎么做呢?这是Go Playground链接:

https://play.golang.org/p/yvL4uFklfG-


更多关于Golang新手问题:如何在一个切片/数组中存储2种结构体的实战教程也可以访问 https://www.itying.com/category-94-b0.html

7 回复
range .People

更多关于Golang新手问题:如何在一个切片/数组中存储2种结构体的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我正在研究 @calmh 的代码。

这通常不是您想要做的事情。

您有什么建议?我该如何传递两个东西?您会怎么做?

但是如何从.html文件中访问它们

之前我直接这样写

{{ range . }}
{{ .Name }}
{{ end }}

我把两个切片放在接口中。在Go中我当然可以写k[0],但我不能写{{ range .[0] }} 或 {{ range k[0] }}

Any 在 Go 中的写法是 interface{}https://play.golang.org/p/hgfazssiRbt

通常我们不建议这样做。但为了将其传递给模板处理,这种做法可能是完全合适的。

func main() {
    var a interface{}
    a = "example"
    fmt.Printf("%T %v\n", a, a)
    a = 42
    fmt.Printf("%T %v\n", a, a)
}

可以传递包含更多字段的结构体,其中一个字段是您现有的切片。

package main

import (
	"fmt"
)

type Params struct {
	Slice  []int
	Offset int
	Limit  int
}

func process(p Params) {
	fmt.Printf("Slice: %v\nOffset: %d\nLimit: %d\n", p.Slice, p.Offset, p.Limit)
}

func main() {
	slice := []int{1, 2, 3, 4, 5}
	process(Params{Slice: slice, Offset: 1, Limit: 3})
}

查看示例代码

你可以使用空接口(interface{})来创建一个切片,其中可以存储不同类型的结构体。这里是一个示例,展示如何将两种结构体类型存储在同一个切片中:

package main

import (
    "fmt"
)

// 定义两种结构体类型
type User struct {
    Name string
    Age  int
}

type Product struct {
    Name  string
    Price float64
}

func main() {
    // 创建空接口切片
    var data []interface{}

    // 添加不同类型的结构体实例
    data = append(data, User{Name: "Alice", Age: 30})
    data = append(data, Product{Name: "Laptop", Price: 999.99})
    data = append(data, User{Name: "Bob", Age: 25})

    // 遍历切片并使用类型断言处理不同类型
    for _, item := range data {
        switch v := item.(type) {
        case User:
            fmt.Printf("User: %s, Age: %d\n", v.Name, v.Age)
        case Product:
            fmt.Printf("Product: %s, Price: $%.2f\n", v.Name, v.Price)
        default:
            fmt.Printf("Unknown type: %T\n", v)
        }
    }
}

在你的模板执行代码中,可以这样使用:

t.Execute(w, data)

在模板中,你可以使用类似的方法通过类型检查来处理不同的结构体:

{{range .}}
    {{if eq (printf "%T" .) "main.User"}}
        <p>User: {{.Name}}, Age: {{.Age}}</p>
    {{else if eq (printf "%T" .) "main.Product"}}
        <p>Product: {{.Name}}, Price: ${{.Price}}</p>
    {{end}}
{{end}}

另一种方法是使用包含两个切片的结构体:

type TemplateData struct {
    Users    []User
    Products []Product
}

data := TemplateData{
    Users:    []User{{Name: "Alice", Age: 30}},
    Products: []Product{{Name: "Laptop", Price: 999.99}},
}

t.Execute(w, data)

然后在模板中分别访问:

{{range .Users}}
    <p>User: {{.Name}}, Age: {{.Age}}</p>
{{end}}

{{range .Products}}
    <p>Product: {{.Name}}, Price: ${{.Price}}</p>
{{end}}

第一种方法允许你在一个切片中混合类型,第二种方法保持类型分离但统一在同一个数据结构中。根据你的具体需求选择合适的方式。

回到顶部