Golang如何同时遍历两个切片优化服务前缀移除逻辑
问题:合并循环处理嵌套切片中的Service字段前缀移除
我正在编写一个接收Profile结构体的函数,该结构体包含两个嵌套切片ServiceNames和Services,二者均包含Service字段。我需要遍历这两个切片,移除Service字段中以'-'分隔的前缀。
目前已实现功能,但使用了两个分别遍历不同切片的for循环,想知道能否改写为单个循环完成遍历处理?
结构体定义与示例JSON
var myJson = ` { "ID": "hgfd5432", "Greeting": "Welcome!", "ServiceNames": [ { "Service": "sevice-name-service1", "Version": "1.8" }, { "Service": "sevice-name-service2", "Version": "1.8" }, { "Service": "sevice-name-service3", "Version": "1.9" }, { "Service": "sevice-name-service4", "Version": "0.6" } ], "Services": [ { "Service": "sevice-name-service5", "Version": "1.8" } ], "BusinessUnit": "Unit 1", "Queue": "UK73_Advocacy_PCCT", "Input": "Default", }` type Profile struct { ProfileId string `json:"ID"` Input string `json:"Input"` ParentProfile string `json:"ParentProfile"` Persona string `json:"Persona"` BusinessUnit string `json:"BusinessUnit"` Greeting string `json:"Greeting"` Queue string `json:"Queue"` ServiceNames []ServiceKey `json:"ServiceNames"` Services []ServiceInfo `json:"Services"` } // 补充缺失的嵌套结构体定义 type ServiceKey struct { Service string `json:"Service"` Version string `json:"Version"` } type ServiceInfo struct { Service string `json:"Service"` Version string `json:"Version"` }
现有函数实现
import "strings" func removePrefix(inputParameters *Profile) error { for i := 0; i < len(inputParameters.ServiceNames); i++ { a := strings.Split(inputParameters.ServiceNames[i].Service, "-") s := a[len(a)-1] inputParameters.ServiceNames[i].Service = s } for i := 0; i < len(inputParameters.Services); i++ { a := strings.Split(inputParameters.Services[i].Service, "-") s := a[len(a)-1] inputParameters.Services[i].Service = s } return nil }
解决方案:合并为单个处理循环
可以通过先收集所有需要处理的Service字段指针,再用单个循环统一处理的方式实现。这种方法既减少了重复代码,也满足了单个循环处理的需求:
import "strings" func removePrefix(inputParameters *Profile) error { // 收集所有需要处理的Service字段指针 var serviceFields []*string for idx := range inputParameters.ServiceNames { serviceFields = append(serviceFields, &inputParameters.ServiceNames[idx].Service) } for idx := range inputParameters.Services { serviceFields = append(serviceFields, &inputParameters.Services[idx].Service) } // 单个循环处理所有字段 for _, sPtr := range serviceFields { parts := strings.Split(*sPtr, "-") *sPtr = parts[len(parts)-1] } return nil }
说明
- 先遍历
ServiceNames和Services两个切片,将每个元素的Service字段指针收集到一个统一的切片中 - 再通过单个循环遍历这个指针切片,对每个
Service字段执行前缀移除逻辑 - 原逻辑中
strings.Split处理无'-'字符串的兼容性被完整保留,不会出现索引越界问题
内容的提问来源于stack exchange,提问作者C-delb
相关产品推荐
相关产品推荐

