簡體   English   中英

在 golang 中與 []struct 交互

[英]Interact with []struct in golang

我有以下代碼:

type AzStorageAccount struct {
Type     string `json:"type"`
Location string `json:"location"`
Tags     struct {
} `json:"tags"`
Properties struct {
    PrivateLinkServiceConnections []struct {
        Name       string `json:"name"`
        Properties struct {
            PrivateLinkServiceID              string `json:"privateLinkServiceId"`
            GroupIds                          string `json:"groupIds"`
            PrivateLinkServiceConnectionState struct {
                Status          string `json:"status"`
                Description     string `json:"description"`
                ActionsRequired string `json:"actionsRequired"`
            } `json:"privateLinkServiceConnectionState"`
        } `json:"properties"`
    } `json:"privateLinkServiceConnections"`
    ManualPrivateLinkServiceConnections []interface{} `json:"manualPrivateLinkServiceConnections"`
    Subnet                              struct {
        ID string `json:"id"`
    } `json:"subnet"`
    CustomDNSConfigs []interface{} `json:"customDnsConfigs"`
} `json:"properties"`

}

但是我在將值分配給 PrivateLinkServiceConnections []struct {} 中的變量時遇到問題

起初我正在使用,但由於我需要使用 []struct 它不再起作用。

storageAccount.Location = "eastus2"
    storageAccount.Type = "Microsoft.Network/privateEndpoints"
    storageAccount.Properties.PrivateLinkServiceConnections.Properties.PrivateLinkServiceId = "/subscriptions"
    storageAccount.Properties.PrivateLinkServiceConnections.Name = "priv-endpoint"
    storageAccount.Properties.PrivateLinkServiceConnections.Properties.GroupIds = "postgresqlServer"
    storageAccount.Properties.PrivateLinkServiceConnections.Properties.PrivateLinkServiceConnectionState.Status = "Approved"
    storageAccount.Properties.PrivateLinkServiceConnections.Properties.PrivateLinkServiceConnectionState.Description = "Auto-approved"
    storageAccount.Properties.PrivateLinkServiceConnections.Properties.PrivateLinkServiceConnectionState.ActionsRequired = "None"
    storageAccount.Properties.Subnet.Id = "/subscriptions/..."

marshaledStorageAccount, _ := json.Marshal(storageAccount)
utils.SendPut(endpoint, marshaledStorageAccount)    

如何為下面的代碼賦值?

PrivateLinkServiceConnections []struct {
        Name       string `json:"name"`
        Properties struct {
            PrivateLinkServiceID              string `json:"privateLinkServiceId"`
            GroupIds                          string `json:"groupIds"`
            PrivateLinkServiceConnectionState struct {
                Status          string `json:"status"`
                Description     string `json:"description"`
                ActionsRequired string `json:"actionsRequired"`
            } `json:"privateLinkServiceConnectionState"`
        } `json:"properties"`
    } `json:"privateLinkServiceConnections"`

謝謝!

最簡單、最明智的方法是定義一個新類型:

type PrivateLinkServiceConnections struct {
        Name       string `json:"name"`
       ...   
}

Properties struct {
    Connections []PrivateLinkServiceConnections  `json:"privateLinkServiceConnections"`
    ...

否則,您必須在每次初始化實例時明確指定每個結構的結構,例如:

x:=struct {
        Name       string `json:"name"`
        Properties struct {
            PrivateLinkServiceID              string `json:"privateLinkServiceId"`
            GroupIds                          string `json:"groupIds"`
            PrivateLinkServiceConnectionState struct {
                Status          string `json:"status"`
                Description     string `json:"description"`
                ActionsRequired string `json:"actionsRequired"`
            } `json:"privateLinkServiceConnectionState"`
        } `json:"properties"`
    }{ 
     Name:"name",
     Properties:struct {
            PrivateLinkServiceID              string `json:"privateLinkServiceId"`
            GroupIds                          string `json:"groupIds"`
            PrivateLinkServiceConnectionState struct {
                Status          string `json:"status"`
                Description     string `json:"description"`
                ActionsRequired string `json:"actionsRequired"`
            } `json:"privateLinkServiceConnectionState"`
        } { 
       PrivateLinkServiceID: id,
     },
 }

storageAccount.PrivateLinkServiceconnections=append(storageAccount.PrivateLinkServiceConnections, x)
...

PrivateLinkServiceConnections被定義為一個數組。 您不能像訪問對象那樣訪問它。 要向其中添加項目,您需要使用append function。

此外,您已將其定義為內聯匿名結構,因此您的代碼變得混亂。 為 PrivateLinkServiceConnections 定義一個特定的類型,然后每次在 append 上,只需分配它,無需重新聲明它。 這是一種不好的做法。

起初我做了一個解決方法來添加我需要的“[]”並且它有效但它不是很好。

但現在我終於明白了

#模型文件

type AccessPolicieS struct {
TenantID string `json:"tenantId"`
ObjectID string `json:"objectId"`
Permissions struct {
    Keys         []string `json:"keys"`
    Secrets      []string `json:"secrets"`
    Certificates []string `json:"certificates"`
    } `json:"permissions"`
}

    type AzVaultPriv struct {
    Properties struct {
        AccessPolicies []AccessPolicieS
    } `json:"properties"`
}


acessP := models.AccessPolicieS{}
    acessP.TenantID  = "*******"
    acessP.Permissions.Keys = append(acessP.Permissions.Keys, "UnwrapKey")
    acessP.Permissions.Keys = append(acessP.Permissions.Keys, "WrapKey")
    acessP.Permissions.Keys = append(acessP.Permissions.Keys, "Get")
    acessP.Permissions.Secrets = append(acessP.Permissions.Secrets, "get")
    acessP.Permissions.Certificates = 
    append(acessP.Permissions.Certificates, "get")

    newModel := models.AzVaultPriv {}
    newModel.Properties.AccessPolicies = append(newModel.Properties.AccessPolicies, acessP)
    marshaledObject, _ := json.Marshal(newModel)

按照下面的一個不理想的解決方法,但讓我繼續前進,直到我解決了這個問題。

func FormatJsonStructVaultPriv(json []byte) []byte {
    json = bytes.Replace(json, []byte("Policies\":{"), []byte("Policies\":[{"), 1)
    json = bytes.Replace(json, []byte("get\"]}}}}"), []byte("get\"]}}]}}"), 1)
    return json
}

謝謝您的幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM