Golang中切片结构的Setter方法

时间:2018-10-03 15:32:23

标签: go struct

我的支撑杆定义如下

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"`
}

该结构的setter函数如下

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(类型[] User)用作   在返回参数prog.go:28:64中键入User:不能使用u(键入User)   作为[]分配中的用户

我是Golang的新手,所以无法弄清楚如何使Setter和Ctor返回切片对象。

2 个答案:

答案 0 :(得分:1)

如果将单个嵌入式用户结构更改为用户列表,则需要在任何地方进行更改。 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))
}

答案 1 :(得分:0)

由于ReqJSON结构包含User的字段,该字段是User结构的一部分,但是您在设置User结构的值时会显示错误没有在setter函数内传递User struct的片段。

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"`
}

如果要初始化包含ReqJSON而不是User的切片的User结构中的字段,则需要在Setter函数中传递用户结构的一部分。在main内部将User struct的切片传递为:

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上的工作代码