Метод установки для структуры среза в Голанге - PullRequest
0 голосов
/ 03 октября 2018

У меня есть стойка, определенная как показано ниже

type ReqJSON struct {
    Request struct {
        Data struct {
            Object struct {
                User []User `json:"user"`
            } `json:"object"`
        } `json:"data"`
    } `json:"request"`
}

type User struct {
    UserID string `json:"userid"`
    IPAddr string `json:"ipaddr"`
    Noofusers string `json:"noofusers"`
    Qos string `json:"qos"`
    ID string `json:"id"`
    Domain string `json:"domain"`
}

Функция установки для этой структуры выглядит следующим образом

func (j *ReqJSON) User() User     { return j.Request.Data.Object.User } 
func (j *ReqJSON) SetUser(u User) { j.Request.Data.Object.User = u }

Основная программа выглядит следующим образом

func main() {
    var j ReqJSON
    j.SetUser(User{
            UserID:    "_id",
            IPAddr:    "1.1.1.1",
            Noofusers: "100",
            Qos:       "34",
            ID:        "kldjflkdfjlkdjfkld",
            Domain:    "xyz.com",
    })

    b, err := json.MarshalIndent(j, "", "  ")
    fmt.Println(err, string(b))
}

Когда я пытался сделать User в качестве среза, я получаю ошибку для вышеуказанной функции.

prog.go: 27: 65: не могу использовать j.Request.Data.Object.User (тип [] Пользователь) как тип Пользователь в возвращаемом аргументе prog.go: 28: 64: нельзя использовать u (тип Пользователь) в качестве типа [] Пользователь в назначении

Я новичок в Голанге, поэтому не могучтобы выяснить, как я могу заставить Setter и Ctor возвращать объект среза.

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Если вы измените одну встроенную пользовательскую структуру на список пользователей, вам нужно будет изменить ее везде.Golang строго типизирован, и часть пользователей отличается от однопользовательской структуры.Следующий код работает

package main

import (
    "fmt"
    "encoding/json"
)

type ReqJSON struct {
    Request struct {
        Data struct {
            Object struct {
                User []User `json:"user"`
            } `json:"object"`
        } `json:"data"`
    } `json:"request"`
}

type User struct {
    UserID    string `json:"userid"`
    IPAddr    string `json:"ipaddr"`
    Noofusers string `json:"noofusers"`
    Qos       string `json:"qos"`
    ID        string `json:"id"`
    Domain    string `json:"domain"`
}

func (j *ReqJSON) User() []User     { return j.Request.Data.Object.User } 
func (j *ReqJSON) SetUsers(u []User) { j.Request.Data.Object.User = u }

func main() {

    var j ReqJSON
    j.SetUsers([]User{
    User{
        UserID:    "_id",
        IPAddr:    "1.1.1.1",
        Noofusers: "100",
        Qos:       "34",
        ID:        "kldjflkdfjlkdjfkld",
        Domain:    "xyz.com",
    },
    })

    b, err := json.MarshalIndent(j, "", "  ")
    fmt.Println(err, string(b))
}
0 голосов
/ 03 октября 2018

Это показывает ошибку, потому что ReqJSON struct содержит поле для User, которое является срезом User struct, но когда вы устанавливаете Value для структуры User, вы не передаете срез структуры User внутриФункция установки.

type ReqJSON struct {
    Request struct {
        Data struct {
            Object struct {
                User []User `json:"user"` // this is a slice of User struct
            } `json:"object"`
        } `json:"data"`
    } `json:"request"`
}

Вам нужно передать фрагмент структуры пользователя в функции Setter, если вы хотите инициализировать поле внутри ReqJSON структуры, которая содержит фрагмент User, а не User.Передайте часть пользовательской структуры в main как:

var u []User
u = append(u, User{
    UserID:    "_id",
    IPAddr:    "1.1.1.1",
    Noofusers: "100",
    Qos:       "34",
    ID:        "kldjflkdfjlkdjfkld",
    Domain:    "xyz.com",
})
j.SetUser(u)

Рабочий код на Go Playground

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...