在Go中使用类似的指针结构分配结构

时间:2017-11-17 11:26:37

标签: pointers go struct go-gorm

我有两个相似的结构,我想将一个结构分配给另一个。 第一个“设备”是用于匹配数据库的结构。第二个“JsonEquipment”是解析JSON数据的辅助结构。

以下是示例:

type Equipment struct {
    ID         uint
    CategoryID uint
    Ip         string
    Login      string
    Password   string
}

type JsonEquipment struct {
    ID           *uint
    Category     *string
    Ip           *string
    Login        *string
    Password     *string
}

指针用于检查JSON中是否存在该字段。更多信息:How to recognize void value and unspecified field when unmarshaling in Go?

所以目前我创建了一个具有许多“if”的功能来检查并分配给设备,但我想知道是否有更好的&清洁解决方案。

func CreateEquipment(item JsonEquipment) (Equipment) {
    e := Equipment{}

    if item.ID != nil && !previousEquipment.Auto { // Is the field present & not automatic equipment
        e.ID = *item.ID
    }

    if item.Ip != nil { // Is the field present ?
        e.Ip = *item.Ip
    }

    if item.Login != nil { // Is the field present ?
        e.Login = *item.Login
    }

    [...]
    return e
}

我希望你能理解这个想法。

  

这个问题类似于   Assign struct with another struct但由于指针=>而不同非指针struct

2 个答案:

答案 0 :(得分:0)

我不确定是否正确理解了你的问题,但不会做这样的工作:

type Equipment struct {
    ID         uint
    CategoryID uint
    Ip         string
    Login      string
    Password   string
}

func main(){
    // Grabing the equipment.
    equips := getEquipment()

    // Checking each equipment for its validity.
    for _, e := range equips {
        if (e.isValid()) {
            fmt.Println(e, "is OK!")
        } else {
            fmt.Println(e, "is NOT OK!")
        }
    }
}

// getEquipment fetches the json from the file.
func getEquipment() (e []Equipment) {
    raw, err := ioutil.ReadFile("./equipment.json")
    if err != nil {
        fmt.Println(err.Error())
        os.Exit(1)
    }

    json.Unmarshal(raw, &e)

    return 
}

// isValid checks if the equipment has all the required fields.
func (e *Equipment) isValid() bool {
    if (e.Ip == "" || e.Login == "") { // You might add more validation rules
        return false
    }

    return true
}

它很简单,但我不确定你还想在这里做什么。
这样你就有了一个Equipment结构,并且不需要包含指针的其他“副本”。

您可以尝试使用此代码here

答案 1 :(得分:0)

修改

我在下面所做的工作但并没有按照我的意图行事。 实际上我的第一个代码是检查空字段和未指定字段之间差异的唯一解决方案。

以下是差异的演示: https://play.golang.org/p/3tU6paM9Do

首先感谢大家的帮助,特别是@Mihailo。

我最终做的是让我的模型结构没有指针,即:

type Equipment struct {
    ID         uint
    CategoryID uint
    Ip         string
    Login      string
    Password   string
}

我使用了一个JSON helper结构,它有一个模型结构的指针,即

type JsonHelper struct {
    Equipments    []*Equipment
    [Add other structures here]
}

最后我使用JsonHelper结构解析了JSON:

func ParseJSON(inputPath string) JsonHelper {
    // Read configuration file
    content, err := ioutil.ReadFile(inputPath)
    if err != nil {
        log.Println("Error:", err)
    }

    var input JsonHelper

    // Parse JSON from the configuration file
    err = json.Unmarshal(content, &input)
    if err != nil {
        log.Print("Error: ", err)
    }

    return input
}

HTH