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
这是一篇关于如何开始使用 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"}
在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结构体,包含Index、Title、Price和Pic字段,分别对应索引、标题、价格和图片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获取第一个项目的标题。

