英文:
Recursive function in go is not storing changes
问题
//递归设置Component结构中所有Parts、PartUse和Components的ExternalID
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为:", component.ExternalID)
}
return input
}
在这个函数中,我试图为这些结构设置ExternalID字段,并且我从另一个函数中调用它。下面是那段代码的片段:
//为每个Part、PartUse和Component设置externalID
for _, component := range retBOM.Components {
component.Components = svc.setExternalID(component.Components)
}
更改没有被持久化,我无法确定原因。当我查看结果时,ExternalID字段仍然为空。我正在编写一个递归函数,因为Component字段是嵌套的。我该如何修复这个问题?
我尝试通过引用传递,但显然在Golang中不允许这样做。
英文:
//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
}
In this function, I'm trying to set the ExternalID field for these structs, and I'm calling it from another function. The code snippet for that is below:
// Set externalID for each Part, PartUse and Component
for _, component := range retBOM.Components {
component.Components = svc.setExternalID(component.Components)
}
The changes aren't being persisted, and I'm unable to tell why. When I look at the result, the ExternalID fields are still coming up empty. I'm writing a recursive function because the Component field is nested. How can I fix this?
I tried to pass by reference but apparently that's not allowed in Golang.
答案1
得分: 0
因为在循环中,你修改的是 Component 的 copy。在迭代结束时,你必须替换它,像这样:
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。
英文:
Its because in cycle youre modifying copy of Component. at the end of iteration you must replace it like
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
}
or use []*Component / *[]*Component instead of *[]Component
答案2
得分: 0
这里有一个相关的问题链接。
但是正如许多人指出的那样,你传递的是组件的副本而不是切片的地址。
所以处理这个问题的最快方法是使用[]*Component
,这在通俗的说法中意味着一个指向组件的切片。
英文:
A closely related question here
But as many pointed out, you are passing the copy of the component but address of the slice.
so the fastest way to handle this is to use
[]*Component
which in layman means a slice of pointer components
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论