【问题标题】:How to check if value exists in struct and save another value in array如何检查结构中是否存在值并将另一个值保存在数组中
【发布时间】:2019-07-30 20:03:47
【问题描述】:

我不确定如何在 Go 中执行此操作,我刚刚开始使用它,所以我不熟悉应该如何完成。

想法是这样的:我在函数内部创建了一个struct

XSiteGroup := struct {
        siteURL string
        siteIDs []string
    }{}

我已经实现了一个获取对象数组的请求;此对象具有以下结构:

{
   "siteId": "",
   "merchantName": "",
   "friendlyTitle": "",
   "url": ""
 }

我要做的是循环遍历该数组并将我找到的每个url 存储为没有重复项的“键”,然后将每个对象的siteId 值存储在siteIDs 数组中结构XSiteGroup。那么让我们说以下场景:

{
   "siteId": "5050",
   "merchantName": "",
   "friendlyTitle": "",
   "url": "url1.com"
},
{
   "siteId": "4050",
   "merchantName": "",
   "friendlyTitle": "",
   "url": "url2.com"
},
{
   "siteId": "8060",
   "merchantName": "",
   "friendlyTitle": "",
   "url": "url1.com"
}

有了上面的结果,我需要存储类似的东西:

{
  siteURL: "url1.com",
  siteIDs: ["5050", "8060"]
}

我现在有这样的东西来循环我拥有的网站数组:

for _, site := range xwebsites {
        u, _ := url.Parse(site.URL)
        urlString := strings.ReplaceAll(u.Host, "www.", "")

        // So I'm thinking here I should handle the struct I created to store values 
        }

如果我不清楚或需要什么其他信息,请告诉我。

【问题讨论】:

  • 你只是在问如何检查一个值是否在一个切片中?
  • 嗯,不完全是,我向端点发出请求,我收到一个具有两个属性的对象数组:siteIdurl;所以我需要检查url 是否已经在我的结构中,如果是,我将siteId 值添加到结构的siteIDs 数组中;我将在问题中包含此内容以提供更多信息
  • @JimB 现在编辑了问题
  • 你需要地图来解决这个问题。

标签: arrays loops go hashmap


【解决方案1】:

如果该值不存在,则必须创建它。您可以使用value, ok := map[key] 进行检查。

type xsitegroup struct {
    url     string
    ids     []string
}

# A mapping between urls and their site groups.
sitegroups := make(map[string]*xsitegroup)

for _, website := range xwebsites {
    url := website["url"]

    sitegroup, ok := sitegroups[url]

    # A sitegroup for this URL doesn't exist
    if !ok {
        # Create the sitegroup
        sitegroup = &xsitegroup{ url: url, ids: []string{} }
        # Add it to the mapping
        sitegroups[url] = sitegroup
    }

    # Append the site id.   
    sitegroup.ids = append(sitegroup.ids, website["siteId"])
}

【讨论】:

  • 谢谢;我会试试这个,在这种情况下,语法是如何读取的?当你说make(map[string]*xsitegroup) 时,我该如何解释?
  • @IvanS95:您需要从掌握语法和内置类型开始:尝试通过 Tour of Go 来解释这一切。
  • 我会通过它;我在我的代码中尝试你的例子,当我到达最后一行时,它说website["siteId"] 我收到一个错误,说model.xSite 类型不支持索引,只是想知道,这是我应该做的吗寻找修复我创建的模型还是修复您提供的代码?
  • @IvanS95 由于您没有提供MVCE 我为我的测试制作了xwebsites := []map[string]string{...},所以website 是一个哈希图。听起来你有[]model.xSite,所以websitemodel.xSite。这意味着您将website 作为结构访问:website.siteIdwebsite.URL 而不是website["url"]website["siteId"]Here's the complete test code.
  • @IvanS95 map[string]*xsitegroup 是一个哈希映射,其中键是 string,值是指向 xsitegroup 结构的指针。 make allocates and initializes memory for the map 这确实是一个需要初始化的结构。阅读Effective GoGo By Example 会有所帮助。
猜你喜欢
  • 2017-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
  • 1970-01-01
  • 2022-07-11
相关资源
最近更新 更多