Golang函数实现问题求助
Golang函数实现问题求助 下午好,我遇到以下函数的问题:
func generateCarouselContent(attachments []string, msg courier.Msg) []map[string]interface{} {
carouselContent := make([]map[string]interface{}, 0)
for _, attachment := range attachments {
_, mediaURL := handlers.SplitAttachment(attachment)
carouselItem := map[string]interface{}{
"text": msg.Text(),
"image": mediaURL,
}
buttons := make([]map[string]interface{}, 0) // 用于存储按钮的切片
for _, quickReplyCarousel := range msg.QuickReplies() {
// 检查 quickReply 是 URL 还是文本
if strings.HasPrefix(quickReplyCarousel, "http") {
buttons = append(buttons, map[string]interface{}{
"text": "Open URL",
"type": "web_url",
"postbackData": "myCustomPostbackData",
"data": quickReplyCarousel,
})
}
}
if len(buttons) > 0 {
carouselItem["buttons"] = buttons // 如果有按钮,则将其添加到轮播项中
}
carouselContent = append(carouselContent, carouselItem)
}
return carouselContent
}

如图所示,文本“Open URL”出现了两次,但我希望它只出现一次。
您能帮助我或提供一些建议吗?
更多关于Golang函数实现问题求助的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你说得对,我完全理解了,我会尝试你的解决方案,并和你分享结果。非常感谢你的帮助。
更多关于Golang函数实现问题求助的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
非常感谢您的帮助,我将从数组中移除所有重复项,看看是否可行。
我会告诉您结果如何。
祝好。
我已经实现了这个修改,并且它运行正确!!!非常感谢你的帮助,实际上问题确实在于 quickReplyIndex := 0 必须放在循环外部,因为它在每次循环中都将其初始化为0了。
非常感谢。
为了进一步说明,在找到第一个以 http 为前缀的快速回复后,for 循环可以 break 以避免收集更多具有相同前缀的字符串。
这不会修复重复的数据,但至少可以防止重复项出现在用户界面中。
那么,我对这段代码的快速“分析”是否正确?
如果是这样,解决方案可能是检查 msg.QuickReplies() 实际包含的内容。如果它包含两个前缀为 http 的元素,那么显然,传递给你的函数的数据已经包含了这个重复项。
这说得通吗?
你好 Christophberger,感谢你的帮助。
这段代码用于 RCS 消息,具体来说,我正在一个图片轮播中实现它,每张图片对应一个链接。正如我在截图中展示的,它打印出了 2 个链接。
希望我已经让你明白了,哈哈。
此致。
如果 msg.QuickReplies() 包含多个以“http”为前缀的实例,那么返回时会出现多个按钮。我认为需要更新创建按钮的过滤器。或者添加按钮的特定元素:
if len(buttons) > 0 {
carouselItem["buttons"] = buttons[0]
}
我不确定我是否理解这段代码的作用。看起来 buttons 会累积来自每个 quickReplyCarousel 的所有按钮。因此,对于 msg.QuickReplies() 中的每个元素,都会有一个按钮被添加到 buttons 中。
循环结束后,包含所有按钮的完整 buttons 映射被赋值给映射 carouselItem,其键为 "buttons"。
如果 msg.QuickReplies() 包含两个前缀为 “http” 的元素,buttons 将包含两个名为 “Open URL” 的按钮。
也许这更像是一个数据问题,而不是代码问题。
如果我对你的代码理解正确,问题出在 quickReplyIndex 上。你在每次 attachment 迭代中都定义了它,导致它总是变为 0。我认为,你应该尝试在函数开始处、外层循环之外定义它:
quickReplyIndex := 0
for _, attachment := range attachments {
// 你的代码在这里...
}
但这会造成混淆,并可能导致 panic 的情况。如果 attachments 仍然存在,但你的 quickReplyIndex 却超出了范围怎么办?我的理解是否正确:附件的数量等于 msg.QuickReplies() 中带有 “http” 前缀的字符串数量?
问题出在循环嵌套上。对于每个附件,您都在遍历所有的快速回复,这会导致重复添加按钮。您需要将按钮的生成逻辑移到附件循环之外,或者确保每个快速回复只被处理一次。
以下是修改后的代码示例:
func generateCarouselContent(attachments []string, msg courier.Msg) []map[string]interface{} {
carouselContent := make([]map[string]interface{}, 0)
// 预先收集所有按钮
buttons := make([]map[string]interface{}, 0)
for _, quickReplyCarousel := range msg.QuickReplies() {
if strings.HasPrefix(quickReplyCarousel, "http") {
buttons = append(buttons, map[string]interface{}{
"text": "Open URL",
"type": "web_url",
"postbackData": "myCustomPostbackData",
"data": quickReplyCarousel,
})
}
}
// 为每个附件创建轮播项
for _, attachment := range attachments {
_, mediaURL := handlers.SplitAttachment(attachment)
carouselItem := map[string]interface{}{
"text": msg.Text(),
"image": mediaURL,
}
if len(buttons) > 0 {
carouselItem["buttons"] = buttons
}
carouselContent = append(carouselContent, carouselItem)
}
return carouselContent
}
这个修改将按钮的收集逻辑移到了附件循环之前,确保每个快速回复只被处理一次,从而避免了重复的"Open URL"按钮。
你好 @lemarkar 感谢你的评论,这对我帮助很大,重复的问题现在已经解决了。
出现了一个新问题,当打印按钮时,所有按钮都显示相同的链接,而实际上配置的是不同的链接。结果就是,只有第一个链接被使用,并在“n”个按钮中重复出现。
我把我的函数分享给你,提前感谢你的帮助。
func generateCarouselContent(attachments []string, msg courier.Msg) []map[string]interface{} {
carouselContent := make([]map[string]interface{}, 0)
for _, attachment := range attachments {
_, mediaURL := handlers.SplitAttachment(attachment)
carouselItem := map[string]interface{}{
"text": msg.Text(),
"image": mediaURL,
}
buttons := make([]map[string]interface{}, 0) // 存储唯一的按钮
// 检查是否至少找到一个作为URL的quickReply
foundURLQuickReply := false
quickReplyIndex := 0
for foundURLQuickReply == false && quickReplyIndex < len(msg.QuickReplies()) {
quickReplyCarousel := msg.QuickReplies()[quickReplyIndex]
// 检查quickReply是URL还是文本
if strings.HasPrefix(quickReplyCarousel, "http") {
// 仅当它是URL且尚未找到任何URL时才添加按钮
foundURLQuickReply = true
buttons = append(buttons, map[string]interface{}{
"text": "Open",
"type": "web_url",
"postbackData": "myCustomPostbackData",
"data": quickReplyCarousel,
})
}
quickReplyIndex++
}
if len(buttons) > 0 {
carouselItem["buttons"] = buttons
}
carouselContent = append(carouselContent, carouselItem)
}
return carouselContent
}

