I am a struct initializer, init struct from others
- Copy from struct to struct with same name
- Calc field from JavaScript expression
- Calc field from multi Object
- source
package main
import (
"encoding/json"
"fmt"
"github.com/pkgng/structor"
)
type Human struct {
Name string
Role string
Age *int32
Tel string
Notes []string
Flags string
}
type AddressT struct {
Address string
Adcode string
Gps string
}
type WifeT struct {
structor.BaseStructor `structor:"CopyByName,Wife"`
Name string
NickName string `structor:"Wife.Name.toLocaleLowerCase()"`
Age int
Age3 int32 `structor:"self.Age + 3"`
}
type Farmer struct {
structor.BaseStructor `structor:"CopyByName,Human,address"`
Name string
Age int64
Nickname string `structor:"self.Name.toLocaleLowerCase()"`
DoubleAge int32 `structor:"Human.Age * 2"`
SuperRole string `structor:"'Farmer-' + Human.Role"`
Notes []string `structor:"Human.Notes.reverse()"`
Flags []string `structor:"Human.Flags.split(',')"`
Contact struct {
Tel string `structor:"Human.Tel"`
Address string `structor:"address.Address"`
Adcode string `structor:"address.Adcode"`
}
Wife WifeT
}
func main() {
var age int32 = 23
var age2 int32 = 22
man := Human{Name: "LiLei", Age: &age, Tel: "18611009988", Role: "Farmer", Notes: []string{"hello", "world"}, Flags: "a,b,c"}
address := AddressT{Adcode: "110108", Address: "北京海淀区五道口优盛大厦D座", Gps: "116.328115,40.054629"}
wife := Human{Name: "HanMeiMei", Age: &age2, Role: "Wife", Notes: []string{"hello", "world"}, Flags: "e,f,g"}
farmer := Farmer{}
structor.New().Set("Human", &man).Set("address", address).Set("Wife", &wife).Construct(&farmer)
// fmt.Printf("%#v\n", farmer)
b, err := json.Marshal(farmer)
if err != nil {
fmt.Println("JSON ERR:", err)
}
fmt.Println(string(b))
}
- output
{
"Name":"LiLei",
"Age":23,
"Nickname":"lilei",
"DoubleAge":46,
"SuperRole":"Farmer-Farmer",
"Notes":["world","hello"],
"Flags":["a","b","c"],
"Contact":{
"Tel":"18611009988",
"Address":"北京海淀区五道口优盛大厦D座",
"Adcode":"110108"
},
"Wife":{
"Name":"HanMeiMei",
"NickName":"hanmeimei",
"Age":22,
"Age3":25
}
}
本工具用于对象的构建,可以指定相同名字字段的copy,
也可以使用其他对象的成员变量计算生成,tag内文本语法为javascrip表达式。
- 基类 structor.BaseStructor
基类的 structor Tag 为逗号分割的字符串,用于指定构建对象需要用到的对象名字;
成员字段计算Tag中可以直接使用这些对象的名字来引用对象;
内置功能字符串为:
内置功能字符串 | 功能描述 |
---|---|
CopyByName | copy 相同名字的字段到目标对象上 |
demo 中 Farmer 的基类Tag 含义为:
从 Human 和 address 两个对象来构建自己,并将有相同名字的字段 copy过来。
- 成员字段计算Tag
tag内文本语法为javascrip表达式,可以使用的变量为基类中指定的对象;
另外 self变量指向本对象,可以使用self来引用CopyByName的字段,因为Copy逻辑在计算逻辑之前执行。
- Structor 对象 Set(name string, value interface{})
添加构建目标对象的资源, 需要指定名字,名字要与BaseStructor Tag 中的名字相同
- Structor Construct(target interface{})
构建目标方法,调用后立即执行,输入参数为需要构建的对象的地址
You can help to make the project better, check out http://gorm.io/contribute.html for things you can do.
pkgng
Released under the MIT License.