在你提供的 Go 代码中,getUdrInfo
函数的目的是从 Redis 数据库中获取 NfProfile 信息,并返回一个映射(map),该映射将 NfProfile 的实例 ID 映射到相应的 UdrInfo。以下是对这段代码的详细分析及建议:
代码分析
变量声明与初始化:
var servedUdrInfo map[string]models.UdrInfo servedUdrInfo = make(map[string]models.UdrInfo) var profiles []models.NfProfile
servedUdrInfo
是一个字符串到models.UdrInfo
的映射,初始为 nil,然后通过make
进行初始化。profiles
是一个切片,用于存储多个NfProfile
实例。
连接 Redis:
redisDb := db.GetRedisDb() keys, err := redisDb.Keys("NfProfile").Result() if err != nil { return nil }
- 使用假设的
db.GetRedisDb()
函数来获取 Redis 数据库连接。 - 获取以
"NfProfile"
为前缀的所有键。如果出现错误,则函数返回nil
.
- 使用假设的
循环处理每个 key:
for _, key := range keys { recordData, err := redisDb.HGetAll(key).Result() if err != nil || len(recordData) == 0 { continue }
- 遍历所有获取到的 Redis 键,对于每个键,通过 HGetAll 获取其所有字段数据,如果发生错误或记录为空,则继续下一个循环。
条件判断和结构体填充:
if recordData["nfType"] == "UDR" { profile := models.NfProfile{} profile.NfInstanceId = key[len("nfInstanceId:"):] // 获取其他字段信息并解析为对应类型 if val, exists := recordData["nfStatus"]; exists { profile.NfStatus = models.NfStatus(val) } if val, exists := recordData["plmnList"]; exists { json.Unmarshal([]byte(val), &profile.PlmnList) } if val, exists := recordData["ipv4Addresses"]; exists { json.Unmarshal([]byte(val), &profile.Ipv4Addresses) } profiles = append(profiles, profile) }
- 如果字段 “nfType” 的值是 “UDR”,则创建一个新的
NfProfile
实例,设置其属性,并填充额外的数据(状态、PLMN 列表和 IPv4 地址)。 - 最后,将这个填充好的结构体添加到 profiles 切片中。
- 如果字段 “nfType” 的值是 “UDR”,则创建一个新的
返回值:
你当前定义了函数返回类型为 map[string]models.UdrInfo
,但实际上在函数内部只构建了一个 profiles []models.NfProfile
数组,而没有将其转换成所需的返回类型。这可能会导致编译错误或者逻辑问题。应该将函数改为返回正确的数据结构。
改进建议
根据你实际需要返回的数据结构,下面是如何修改代码的一些建议:
- 如果确实希望返回
map[string]models.UdrInfo
,则在填充完 profiles 后,需要将这些信息转换成所需的映射格式。
for _, profile := range profiles {
udrInfo := models.UdrInfo{
// 假设这里要从 profile 填充相应的 UdrInfo 字段,比如:
NfInstanceId: profile.NfInstanceId,
NfStatus: profile.NfStatus,
PlmnList: profile.PlmnList,
Ipv4Addresses: profile.Ipv4Addresses,
}
servedUdrInfo[udrInfo.NfInstanceId] = udrInfo
}
- 完整示例更新如下:
func getUdrInfo() map[string]models.UdrInfo {
servedUdrInfo := make(map[string]models.UdrInfo) // 初始化字典
var profiles []models.NfProfile
redisDb := db.GetRedisDb()
keys, err := redisDb.Keys("NfProfile").Result()
if err != nil {
return nil // 出现错误时直接返回nil
}
for _, key := range keys {
recordData, err := redisDb.HGetAll(key).Result()
if err != nil || len(recordData) == 0 {
continue // 出现错误或无数据则继续下一个key
}
if recordData["nfType"] == "UDR" { // 检查 nfType 是否是 UDR
profile := models.NfProfile{}
profile.NfInstanceId = key[len("nfInstanceId:"):]
// 获取其他字段信息并解析为对应类型
if val, exists := recordData["nfStatus"]; exists {
profile.NfStatus = models.NfStatus(val)
}
if val, exists := recordData["plmnList"]; exists {
json.Unmarshal([]byte(val), &profile.PlmnList)
}
if val, exists := recordData["ipv4Addresses"]; exists {
json.Unmarshal([]byte(val), &profile.Ipv4Addresses)
}
profiles = append(profiles, profile) // 收集所有 Profile 信息
}
}
for _, profile := range profiles { // 将收集的信息转换为 UDR 信息并存入字典
udrInfo := models.UdrInfo{
NfInstanceId: profile.NfInstanceId,
NfStatus: profile.NfStatus,
PlmnList: profile.PlmnList,
Ipv4Addresses: profile.Ipv4Addresses,
}
servedUdrInfo[udrInfo.NfInstanceId] = udrInfo
}
return servedUdrInfo // 返回字典结果
}
以上就是对你的 Go 函数的一些分析与改进建议!希望能帮助你更好地理解和使用这段代码。如果有其他问题,请随时问我!
内容由零声教学AI助手提供,问题来源于学员提问