10

MagicArray:像php一样,让Go业务代码不再卷! - 阿旭^_^

 8 months ago
source link: https://www.cnblogs.com/a-xu/p/17929336.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

MagicArray:像php一样,让Go业务代码不再卷!

卷!一个字形容了当今码农行业的现状。一层一层的代码结构,一个一个dto,entity,vo,req,resp。这些对象越来越多,让码农们非常劳于奔命,加一个字段,改一个字段,影响面有多少。代码量也越来越大。有可能一个代码,要建10多个数据对象。这虽然有点夸张,但体现了行业的乱象。

我是曾经写php代码的研发,由于php的并发能力的不足,和编译检错能力不足,导致行业用php越来越少了。但是不得不说,在php的时代,跟本不需要这么多对象,因为有一个强大的array,包罗万象。难道我们go、java都不能也通过这种方式实现吗?

389174-20231226235052441-573262491.png

Allright,  由此,MagicArray就诞生了,不用关心类型,不用关心空指针,不用创建哪么多数据对象,轻松数据转换。废话不多说,上代码:

DTO替代方式:

package main

import (
    "encoding/json"
    "fmt"
    arr "github.com/lingdor/magicarray"
    "time"
)

type UserDTO struct {
    Id   int `json:"userid"`
    Name string
}

type ScoreDTO struct {
    Score     int
    ScoreTime time.Time
}

type AreaDto struct {
    CityId int
    City   string
}

func dtosCommand() {

    user := UserDTO{
        Id:   1,
        Name: "bobby",
    }
    score := ScoreDTO{
        Score:     66,
        ScoreTime: time.Now(),
    }
    area := AreaDto{
        CityId: 10000,
        City:   "beij",
    }

    mix, _ := arr.Merge(arr.ValueofStruct(user), score, area)
    mix = arr.Pick(mix, "Id", "City", "Score")
    if bs, err := json.Marshal(mix); err == nil {
        fmt.Println(string(bs))
    } else {
        panic(err)
    }

}
{"userid":1,"City":"newyork","Score":66}
package main

import (
    "encoding/json"
    "fmt"
    arr "github.com/lingdor/magicarray"
)

type ColumnUserEntity struct {
    Id       int `json:"uid"`
    UserName string
    IsMale   bool
}

func columnCommand() {

    users := []ColumnUserEntity{
        {
            Id:       1,
            UserName: "Bobby",
            IsMale:   true,
        },
        {
            Id:       2,
            UserName: "Lily",
            IsMale:   false,
        },
    }

    usersArr := arr.ValueOfSlice(users)
    usersArr = arr.WashColumn(usersArr, arr.WashTagRuleJsonInitialLower())
    if bs, err := json.Marshal(usersArr); err == nil {
        fmt.Println(string(bs))
    } else {
        panic(err)
    }

    usersArr = arr.Column(usersArr, "UserName")
    if bs, err := json.Marshal(usersArr); err == nil {
        fmt.Println(string(bs))
    } else {
        panic(err)
    }

}
["Bobby","Lily"]

tag操作

package main

import (
    "encoding/json"
    "fmt"
    arr "github.com/lingdor/magicarray"
)

type UserEntity struct {
    Id       int `json:"uid"`
    UserName string
    IsMale   bool
}

func tagCommand() {

    users := UserEntity{
        Id:       1,
        UserName: "Bobby",
        IsMale:   true,
    }

    userArr := arr.ValueofStruct(users)
    userArr = arr.SetTag(userArr, "Id", "json", "UserId")
    if bs, err := json.Marshal(userArr); err == nil {
        fmt.Println(string(bs))
    } else {
        panic(err)
    }

}
[
   {"uid":1,"userName":"Bobby","isMale":true},
   {"uid":2,"userName":"Lily","isMale":false}
]

参考:https://lingdor.medium.com/magicarray-use-to-data-translate-easily-8831b937bfc1


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK