Golang中如何在使用空map对象时处理结构体键值对
Golang中如何在使用空map对象时处理结构体键值对
type ResourceAcess struct {
ID string `json:"id"`
Type string `json:"type"`
adminConsent bool `default:true`
}
type RequiredResourceAccess struct {
ResourceAccess []ResourceAcess `json:"resourceAccess"`
ResourceAppID string `json:"resourceAppId"`
ID string `json:"id"`
}
type addedpermissions struct {
RequiredResourceAccess []RequiredResourceAccess `json:"requiredResourceAccess"`
Type string `json:"type"`
ResourceAccess []ResourceAcess `json:"resourceAccess"`
ID string `json:"id"`
}
func (self *addedPermissions) addpermissions(ID string, Type string, flag bool) {
permissions := make(map[RequiredResourceAccess]addedpermissions)
a1 := ID
b1 := RequiredResourceAccess{ID: a1}
if val, ok := permissions[b1]; ok {
//permissions[b1] = val
flag = true
fmt.Println(“application id are already present…”, flag)
}
if flag == false {
for key, value := range permissions {
permissions = append(permissions,[ID: ID, Type: Type, bool: false])
fmt.Println(“application permissions are added”, permissions)
}
}
}
这里我通过使用标志位来检查资源ID是否已更新,如果没有,我需要这些权限。
为了更好地理解:
发生错误:所有尝试均失败: #1: 状态码不正常:400。响应体:{“error”:{“code”:“Request_BadRequest”,“message”:“Permission being assigned already exists on the object”,“details”:[{“code”:“InvalidUpdate”,“target”:“None”,“message”:“Permission being assigned already exists on the object”}],“innerError”:{“date”:“2021-12-07T06:33:48”,“request-id”:“77bfb984-987b-4830-94b2-ecb9cf5e0e06”,“client-request-id”:“77bfb984-987b-4830-94b2-ecb9cf5e0e06”}}} pricipalID:ca52bd7f-c038-4275-ab0e-a23249cdfccd, resourceAppID:3cf1a260-0c4e-4638-a91e-a7aebcc1832e, resourceAccess ID:06b708a9-e830-4db3-a914-8e69da51d44f{“principalId”:“ca52bd7f-c038-4275-ab0e-a23249cdfccd”,“resourceId”:“3cf1a260-0c4e-4638-a91e-a7aebcc1832e”,“appRoleId”:“06b708a9-e830-4db3-a914-8e69da51d44f”}
dbaae8cf-10b5-4b86-a4a1-f871c94c6695 - 已存在。 bf7b1a76-6e77-406b-b258-bf5c7720e98f - 已存在。 {“requiredResourceAccess”:[{“resourceAccess”:[{“id”:“e1fe6dd8-ba31-4d61-89e7-88639da4683d”,“type”:“Scope”},{“id”:“18a4783c-866b-4cc7-a460-3d5e5662c884”,“type”:“Role”},{“id”:“1bfefb4e-e0b5-418b-a88f-73c46d2cc8e9”,“type”:“Role”},{“id”:“19dbc75e-c2e2-444c-a770-ec69d8559fc7”,“type”:“Role”},{“id”:“06b708a9-e830-4db3-a914-8e69da51d44f”,“type”:“Role”},{“id”:“ef54d2bf-783f-4e0f-bca1-3210c0444d99”,“type”:“Role”},{“id”:“6918b873-d17a-4dc1-b314-35f528134491”,“type”:“Role”},{“id”:“75359482-378d-4052-8f01-80520e7db3cd”,“type”:“Role”},{“id”:“62a82d76-70ea-41e2-9197-370581804d09”,“type”:“Role”},{“id”:“e2a3a72e-5f79-4c64-b1b1-878b674786c9”,“type”:“Role”},{“id”:“b633e1c5-b582-4048-a93e-9f11b44c7e96”,“type”:“Role”},{“id”:“b528084d-ad10-4598-8b93-929746b4d7d6”,“type”:“Role”},{“id”:“a82116e5-55eb-4c41-a434-62fe8a61c773”,“type”:“Role”},{“id”:“0c0bf378-bf22-4481-8f81-9e89a9b4960a”,“type”:“Role”},{“id”:“332a536c-c7ef-4017-ab91-336970924f0d”,“type”:“Role”},{“id”:“9492366f-7969-46a4-8d15-ed1a20078fff”,“type”:“Role”},{“id”:“0121dc95-1b9f-4aed-8bac-58c5ac466691”,“type”:“Role”},{“id”:“4437522e-9a86-4a41-a7da-e380edd4a97d”,“type”:“Role”},{“id”:“70dec828-f620-4914-aa83-a29117306807”,“type”:“Role”},{“id”:“a267235f-af13-44dc-8385-c1dc93023186”,“type”:“Role”},{“id”:“73a45059-f39c-4baf-9182-4954ac0e55cf”,“type”:“Role”},{“id”:“9f67436c-5415-4e7f-8ac1-3014a7132630”,“type”:“Role”},{“id”:“908de74d-f8b2-4d6b-a9ed-2a17b3b78179”,“type”:“Role”},{“id”:“eb6b3d76-ed75-4be6-ac36-158d04c0a555”,“type”:“Role”},{“id”:“bdd80a03-d9bc-451d-b7c4-ce7c63fe3c8f”,“type”:“Role”},{“id”:“49981c42-fd7b-4530-be03-e77b21aed25e”,“type”:“Role”},{“id”:“a96d855f-016b-47d7-b51c-1218a98d791c”,“type”:“Role”},{“id”:“23fc2474-f741-46ce-8465-674744c5c361”,“type”:“Role”},{“id”:“2280dda6-0bfd-44ee-a2f4-cb867cfc4c1e”,“type”:“Role”},{“id”:“dfb0dd15-61de-45b2-be36-d6a69fba3c79”,“type”:“Role”},{“id”:“741f803b-c850-494e-b5df-cde7c675a1ca”,“type”:“Role”},{“id”:“dbaae8cf-10b5-4b86-a4a1-f871c94c6695”,“type”:“Role”},{“id”:“bf7b1a76-6e77-406b-b258-bf5c7720e98f”,“type”:“Role”}],“resourceAppId”:“00000003-0000-0000-c000-000000000000”}]} {[{ca52bd7f-c038-4275-ab0e-a23249cdfccd}]}
更多关于Golang中如何在使用空map对象时处理结构体键值对的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于Golang中如何在使用空map对象时处理结构体键值对的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你的代码存在几个关键问题,主要涉及map的使用和结构体作为键的限制。以下是修正后的实现:
package main
import (
"fmt"
)
type ResourceAccess struct {
ID string `json:"id"`
Type string `json:"type"`
AdminConsent bool `json:"adminConsent"`
}
type RequiredResourceAccess struct {
ResourceAccess []ResourceAccess `json:"resourceAccess"`
ResourceAppID string `json:"resourceAppId"`
ID string `json:"id"`
}
type AddedPermissions struct {
RequiredResourceAccess []RequiredResourceAccess `json:"requiredResourceAccess"`
Type string `json:"type"`
ResourceAccess []ResourceAccess `json:"resourceAccess"`
ID string `json:"id"`
}
func (ap *AddedPermissions) AddPermissions(appID string, resourceType string) error {
// 检查是否已存在相同的ResourceAppID
for _, rra := range ap.RequiredResourceAccess {
if rra.ResourceAppID == appID {
return fmt.Errorf("application id %s already exists", appID)
}
}
// 创建新的RequiredResourceAccess
newRRA := RequiredResourceAccess{
ResourceAppID: appID,
ResourceAccess: []ResourceAccess{
{
ID: ap.ID,
Type: resourceType,
AdminConsent: false,
},
},
}
// 添加到切片
ap.RequiredResourceAccess = append(ap.RequiredResourceAccess, newRRA)
fmt.Printf("application permissions added for appID: %s\n", appID)
return nil
}
// 如果需要使用map,这里是一个使用string作为键的示例
func (ap *AddedPermissions) AddPermissionsWithMap(appID string, resourceType string) error {
// 使用map来快速查找,键为ResourceAppID
resourceMap := make(map[string]RequiredResourceAccess)
// 填充map
for _, rra := range ap.RequiredResourceAccess {
resourceMap[rra.ResourceAppID] = rra
}
// 检查是否已存在
if _, exists := resourceMap[appID]; exists {
return fmt.Errorf("application id %s already exists", appID)
}
// 创建新的并添加到map和切片
newRRA := RequiredResourceAccess{
ResourceAppID: appID,
ResourceAccess: []ResourceAccess{
{
ID: ap.ID,
Type: resourceType,
AdminConsent: false,
},
},
}
resourceMap[appID] = newRRA
ap.RequiredResourceAccess = append(ap.RequiredResourceAccess, newRRA)
return nil
}
func main() {
ap := &AddedPermissions{
ID: "test-id",
RequiredResourceAccess: []RequiredResourceAccess{
{
ResourceAppID: "existing-app-id",
ResourceAccess: []ResourceAccess{
{ID: "role-1", Type: "Role", AdminConsent: true},
},
},
},
}
// 测试添加新权限
err := ap.AddPermissions("new-app-id", "Role")
if err != nil {
fmt.Println("Error:", err)
}
// 测试添加已存在的权限
err = ap.AddPermissions("existing-app-id", "Role")
if err != nil {
fmt.Println("Error:", err)
}
// 输出结果
fmt.Printf("Final permissions: %+v\n", ap.RequiredResourceAccess)
}
关键修正点:
-
结构体作为map键的问题:在Go中,结构体作为map键需要是可比较的类型。你的
RequiredResourceAccess结构体包含切片字段,而切片是不可比较的,因此不能直接作为map键。修正方案是使用ResourceAppID(string类型)作为键。 -
map初始化问题:你的代码中
permissions := make(map[RequiredResourceAccess]addedpermissions)创建了一个空map,但后续操作都在这个空map上进行,没有使用结构体实例的数据。 -
逻辑错误:
append函数使用不正确,且permissions变量类型不匹配。 -
错误处理:根据你的错误信息,API返回400错误表明权限已存在。修正后的代码会先检查
ResourceAppID是否已存在,避免重复添加。 -
命名规范:修正了结构体和方法的命名(Go推荐使用驼峰命名法)。
这个实现会先检查ResourceAppID是否已存在,如果不存在则添加新的权限记录,避免了重复添加导致的API错误。

