登录
首页 >  Golang >  Go问答

go中的递归函数不存储更改

来源:stackoverflow

时间:2024-04-16 16:45:38 459浏览 收藏

在IT行业这个发展更新速度很快的行业,只有不停止的学习,才不会被行业所淘汰。如果你是Golang学习者,那么本文《go中的递归函数不存储更改》就很适合你!本篇内容主要包括##content_title##,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

//recursively set externalid for all parts, partuse, components in component struct
func (svc *productmanagementclient) setexternalid(input *[]component) *[]component {
    for _, component := range *input {
        if component.components != nil {
            component.components = svc.setexternalid(component.components)
        }
        component.partuse.externalid = component.partuse.id
        component.part.externalid = component.part.id
        for _, occurrence := range component.occurrences {
            occurrence.externalid = occurrence.id
        }
        component.externalid = "partid:" + component.part.id + ",partuseid:" + component.partuse.id
        zap.s().debug("externalid for component:", component.externalid)
    }
    return input
}

在此函数中,我尝试为这些结构设置externalid 字段,并从另一个函数调用它。其代码片段如下:

// Set externalID for each Part, PartUse and Component
for _, component := range retBOM.Components {
    component.Components = svc.setExternalID(component.Components)
}

这些更改没有被持久化,我无法说出原因。当我查看结果时,externalid 字段仍然为空。我正在编写一个递归函数,因为 component 字段是嵌套的。我该如何解决这个问题?

我尝试通过引用传递,但显然 golang 中不允许这样做。


正确答案


密切相关的问题here

但正如许多人指出的那样,您传递的是组件的副本,而不是切片的地址。

所以处理这个问题最快的方法是使用 []*component 通俗来说就是指针组件的切片

这是因为在循环中你正在修改组件的副本。在迭代结束时,您必须像这样替换它

for i, component := range *input {
    if component.Components != nil {
        component.Components = svc.setExternalID(component.Components)
    }
    component.PartUse.ExternalID = component.PartUse.ID
    component.Part.ExternalID = component.Part.ID
    for _, occurrence := range component.Occurrences {
        occurrence.ExternalID = occurrence.ID
    }
    component.ExternalID = "PartID:" + component.Part.ID + ",PartUseID:" + component.PartUse.ID
    zap.S().Debug("ExternalID for component:", component.ExternalID)
    // replace current state by new one
    *input[i] = component
}

或使用 []*component / *[]*component 而不是 *[]component

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>