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
}

image

如图所示,文本“Open URL”出现了两次,但我希望它只出现一次。

您能帮助我或提供一些建议吗?


更多关于Golang函数实现问题求助的实战教程也可以访问 https://www.itying.com/category-94-b0.html

11 回复

你说得对,我完全理解了,我会尝试你的解决方案,并和你分享结果。非常感谢你的帮助。

更多关于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
}
回到顶部