Golang中map和struct的数据存储方法探讨

Golang中map和struct的数据存储方法探讨 大家好, 我是Go语言的新手,希望能得到一些简单的帮助来理解这门语言。

我抓取了一些项目数据,包括图片、价格和商品标题等简单信息。现在我可以打印每个值,但如何将这些值存储到数组中?

最终我想要得到一个项目数组。

e.DOM.Find(".sresult").Each(func(index int, item *goquery.Selection) {

		items := item
		price := items.Find(".prc .bold").Text()
		title := items.Find(".vip").Text()
		pic, _ := items.Find(".imgWr img").Attr("imgurl")
		fmt.Println(index, title, price, pic)
}

更多关于Golang中map和struct的数据存储方法探讨的实战教程也可以访问 https://www.itying.com/category-94-b0.html

8 回复

有人吗?

更多关于Golang中map和struct的数据存储方法探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这是一篇关于如何开始使用 Go 语言切片的优秀读物:https://blog.golang.org/go-slices-usage-and-internals

可以使用结构体切片。例如

type MyItem {
Index int
Title string
price float64
Pic string
}

var items []MyItems

// 创建项目
item := MyItem{ 1, "Item Title", 100.25, "MyPic.png"}

// 添加到切片
items = append(items, item)

希望对你有帮助

首先我要说的是,你可能不需要数组,而是需要切片。在 Go 语言中,它们很相似,但存在一些重要区别。

浏览你的帖子后,很难给出具体指导,因为我们没有足够的上下文来完全理解代码。我也从未使用过 goquery,所以不太确定所有内容是如何工作的。看起来你已经弄清楚了如何打印项目,接下来只需要将它们添加到切片中。

Go 教程在解释数组和切片方面做得很好,如果你还没看过,我建议你去学习一下:

感谢各位

我正在理解数据结构的基础知识,目前唯一的问题是如何处理动态数据。 我将通过Yamil_Bracho的例子来说明:

package main

import (
    "fmt"
)

type MyItem struct {
    Index int
    Title string
    price float64
    Pic   string
}

var items []MyItem

func main() {
    item := MyItem{1, "Item Title", 100.25, "MyPic.png"}
    item = MyItem{2, "new Title", 150.25, "MyPic.png"}

    // 添加到切片
    items = append(items, item)
    fmt.Println(items)
}

// 创建项目

最终结果只是添加到切片的最后一个项目,而我想要创建一个项目列表并将它们一起转换为JSON。

yossiytd:

func main() {
  item := MyItem{1, “Item Title”, 100.25, “MyPic.png”}
  item = MyItem{2, “new Title”, 150.25, “MyPic.png”}
  // Add to slice
  items = append(items, item)
  fmt.Println(items)
}

你首先创建了一个条目,然后立即覆盖了它,最后只将最后一个条目添加到了空切片中。

func main() {
  item := MyItem{1, “Item Title”, 100.25, “MyPic.png”}
  items = append(items, item)
  item = MyItem{2, “new Title”, 150.25, “MyPic.png”}
  items = append(items, item)
  fmt.Println(items)
}

这可能更符合你的需求。

如果你想将数据转换为JSON输出,只需对数据进行序列化处理。

https://blog.golang.org/json-and-go

package main

import (
   "encoding/json"
   "fmt"
)

type Item struct {
   Index int
   Title string
   Price float64
   Pic string
}

func main() {
   
   item := Item{1, "Item Title", 100.25, "MyPic.png"}
   item = Item{2, "new Title", 150.25, "MyPic.png"}
   
   b, err := json.Marshal(item)
   if err != nil {
   	fmt.Println("error:", err)
   }
   fmt.Printf("Result: %s\n",b)	
}

输出结果

Result: {"Index":2,"Title":"new Title","Price":150.25,"Pic":"MyPic.png"}

代码演练场 - https://play.golang.org/p/QBeFfFqbwyb

在Go语言中,你可以使用结构体(struct)来组织数据,并使用切片(slice)来存储多个结构体实例,从而创建一个项目数组。以下是基于你提供的代码的改进版本:

// 定义结构体来存储每个项目的数据
type Item struct {
    Index int
    Title string
    Price string
    Pic   string
}

func main() {
    var itemsList []Item // 创建一个Item类型的切片

    e.DOM.Find(".sresult").Each(func(index int, item *goquery.Selection) {
        price := item.Find(".prc .bold").Text()
        title := item.Find(".vip").Text()
        pic, _ := item.Find(".imgWr img").Attr("imgurl")

        // 创建Item实例并添加到切片中
        newItem := Item{
            Index: index,
            Title: title,
            Price: price,
            Pic:   pic,
        }
        itemsList = append(itemsList, newItem)
    })

    // 打印整个切片以验证数据
    fmt.Printf("%+v\n", itemsList)
}

在这个示例中:

  • 我定义了一个Item结构体,包含IndexTitlePricePic字段,分别对应索引、标题、价格和图片URL。
  • 使用[]Item切片itemsList来存储所有项目。
  • Each循环中,为每个项目创建一个Item实例,并通过append函数将其添加到切片中。
  • 最后,使用fmt.Printf打印整个切片,%+v格式化动词会显示结构体的字段名和值,便于调试。

这种方法比使用map更类型安全,因为结构体字段是固定的,编译器可以检查类型错误。如果你需要动态字段,可以考虑map,但对于固定结构的数据,struct是更合适的选择。例如,使用map的替代方式:

itemsList := []map[string]interface{}{}
e.DOM.Find(".sresult").Each(func(index int, item *goquery.Selection) {
    price := item.Find(".prc .bold").Text()
    title := item.Find(".vip").Text()
    pic, _ := item.Find(".imgWr img").Attr("imgurl")
    
    itemMap := map[string]interface{}{
        "index": index,
        "title": title,
        "price": price,
        "pic":   pic,
    }
    itemsList = append(itemsList, itemMap)
})
fmt.Printf("%+v\n", itemsList)

但struct版本在性能和代码可读性上更优。运行后,itemsList将包含所有抓取的项目数据,你可以通过索引访问,例如itemsList[0].Title获取第一个项目的标题。

回到顶部