特征
go-model库提供了方便的方法来处理struct以下突出显示的功能。它是从开发Go应用程序或实用程序时的典型需求中诞生的。希望对Go社区有所帮助!

嵌入式/匿名结构
多层嵌套struct / map / slice
struct / map / slice中的指针和非指针
在地图和切片内构造
嵌入/匿名结构字段在地图中的显示级别与Go表示的级别相同
struct / map / slice中的接口
reflect.Kind通过字段名称获取结构字段
获取所有结构字段标记(reflect.StructTag)或按字段名称有选择地获取
获取所有reflect.StructField给定的struct实例
通过结构上的各个字段名称获取或设置
将全局无遍历类型添加到列表或使用notraversestruct字段中的选项
命名映射键的选项,忽略空字段,并指示不要遍历struct / map / slice
混合的非指针类型之间的转换-添加自定义对话方法,请参阅用法
安装
稳定版-准备生产
请参阅“版本控制”部分以获取详细信息。

go.mod

需要gopkg.in/jeevatkm/go-model.v1 v1.1.0
去弄

去获取-u gopkg.in/jeevatkm/go-model.v1
这可能对您的项目有益 微笑
go-model的作者还向Go Community发布了以下项目。

aah框架-安全,灵活,快速的Go Web框架。
THUMBAI,源代码-Go Mod存储库,Go Vanity服务和简单​​代理服务器。
go-resty-Go的简单HTTP和REST客户端。
用法
将go-model导入您的代码,并将其称为model。查看模型测试用例以了解更多可能性。

导入(
“ gopkg.in/jeevatkm/go-model.v1”

支持的方法
复制-使用,godoc
地图-用法,godoc
克隆-使用,godoc
IsZero -用法,godoc
HasZero -用法,godoc
IsZeroInFields-用法,godoc
字段-用法,godoc
种类-用法,godoc
标签-用法,godoc
标签-用法,godoc
获取-使用,godoc
集-使用,godoc
AddNoTraverseType-用法,godoc
RemoveNoTraverseType-用法,godoc
AddConversion-用法,godoc
RemoveConversion-用法,godoc
复制方式
如何将我的结构对象复制到另一个?不用担心,go-model会进行深度复制。

//假设您刚刚解码/解组了请求主体以构造对象。
tempProduct,_ := myapp。ParseJSON(请求。身体)

产品 := 产品{}

//用适当的选项标记商品字段,例如
//-,omtempty,notraverse以获得所需的结果。
//不用担心,go-model可以进行深度复制:)
errs := model。复制(&product,tempProduct)
fmt。Println(“错误:”,错误)

fmt。Printf(“ \ n来源:%#v \ n ”,tempProduct)
fmt。Printf(“ \ n目标:%#v \ n ”,产品)
地图方法
我想将我的结构转换为Map(map[string]interface{})。当然,go-model可以进行深度转换。

//用适当的选项标记您的SearchResult字段,例如
//-,name,omitempty,notraverse以获取所需的结果。
sr,_ := myapp。GetSearchResult(/ 参数在这里 /)

//嵌入式/匿名结构域出现在地图中的级别相同围棋表示
srchResMap,ERR := 模型。映射(sr)
fmt。Println(“错误:”,err)

fmt。Printf(“ \ n搜索结果图:%#v \ n ”,srchResMap)
克隆方法
我想克隆我的结构对象。很好,您知道go-model可以进行深度处理。

输入 := 产品{ / 产品结构字段值转到此处 / }

//对结构字段进行适当标记。诸如
//-,name,omtempty,notraverse之
类的选项可获得所需的结果。clonedObj := 模型。克隆(输入)

//让我们看一下结果
fmt。Printf(“ \ n克隆对象:%#v \ n ”,clonedObj)
IsZero方法
我想检查我的结构对象是否为空。当然,go-model会进行深零检查。

//假设您刚刚解码/解组了请求主体以构造对象。
productInfo,_ := myapp。ParseJSON(请求。身体)

//要检查productInfo是否为空
isEmpty := model。IsZero(productInfo)

//用适当的选项标记您的ProductInfo字段,例如
//-,omtempty,notraverse以获取所需的结果。
fmt。Println(“嘿,我所有字段的零值为:”,isEmpty)
HasZero方法
我想检查我的结构对象是否有零/空值。当然,go-model会进行深零检查。

//假设您刚刚解码/解组了请求主体以构造对象。
productInfo,_ := myapp。ParseJSON(请求。身体)

//要检查productInfo是否为空
isEmpty := model。HasZero(productInfo)

//用适当的选项标记您的ProductInfo字段,例如
//-,omtempty,notraverse以获取所需的结果。
fmt。Println(“嘿,我有零值:”,isEmpty)
IsZeroInFields方法
是否可以检查特定字段的值为零/空。当然可以。

//假设您刚刚解码/解组了请求主体以构造对象。
产品,_ := MyApp的。ParseJSON(请求。身体)

//检查特定字段的值为零或不是
fieldName,isEmpty := model。IsZeroInFields(产品,“ SKU”,“标题”,“ InternalIdentifier”)

fmt。Println(“ Empty Field Name:”,fieldName)
fmt。Println(“是,我的值为零:”,isEmpty)
场法
您想要来自的所有字段struct,是的,您可以拥有它:)

src := SampleStruct {
/ 结构字段进入此处 /
}

字段,_ := 模型。字段(src)
fmt。Println(“字段:”,字段)
实物方法
go-model库提供了一种以reflect.Kind简单的方式了解的能力。

src := SampleStruct {
/ 结构字段进入此处 /
}

fieldKind,_ := 模型。种类(src,“ BookingInfoPtr”)
fmt。Println(“字段类型:”,fieldKind)
标记方式
我想从我的Go语言支持的Tag值中获取struct。是的,很容易得到它。

SRC := SampleStruct {
bookcount后 诠释

JSON: “ - ”

的bookcode 串
JSON: “ - ”

ArchiveInfo BookArchive
JSON: “archive_info,omitempty”

地区 BookLocale
JSON: “区域,omitempty”

}

标签,_ := 模型。标记(src,“ ArchiveInfo”)
fmt。的println(“变量值”,标签。获得(“JSON” ))

//输出:
标记 值:archive_info,omitempty
标签方法
我想从中获取所有字段Tag值struct。这简单。

SRC := SampleStruct {
bookcount后 诠释

JSON: “ - ”

的bookcode 串
JSON: “ - ”

ArchiveInfo BookArchive
JSON: “archive_info,omitempty”

地区 BookLocale
JSON: “区域,omitempty”

}

标签,_ := 模型。标记(src)
fmt。Println(“标签:”,标签)
获取方法
我想通过字段名称获取价值struct。是的,很容易得到它。

src := SampleStruct {
BookCount:100,
BookCode: “ GHT67HH00”,
}

值,_ := 模型。获取(src,“ BookCode”)
fmt。Println(“ Value:”,value)

//输出:
值:GHT67HH00
设定方法
我想在我的上按字段名称设置值struct。是的,很容易得到它。

src := SampleStruct {
BookCount:100,
BookCode: “ GHT67HH00”,
}

err := 模型。设置(&src,“ BookCount”,200)
fmt。Println(“错误:”,err)
AddNoTraverseType和RemoveNoTraverseType方法
在某些情况下,您需要对象值,但又不想遍历/查看struct对象内部。notraverse在模型标签中为这些字段使用选项或添加它NoTraverseTypeList。根据您的需要进行自定义。

默认NoTraverseTypeList有这些类型time.Time{},&time.Time{},os.File{},&os.File{},http.Request{},&http.Request{},http.Response{},&http.Response{}。

//如果您已将类型添加到列表中,则无需为这些类型提及

notraverse
选项。

//将类型添加到NoTraverseTypeList
模型中。AddNoTraverseType(时间。位置{},和时间。位置{})

//从NoTraverseTypeList
模型中删除类型。RemoveNoTraverseType(时间。位置{},和时间。位置{})
AddConversion和RemoveConversion方法
本示例注册从int到string类型的自定义转换。

AddConversion((* INT)(零),(*字符串)(零),FUNC(在反映。值)(反映。值,误差){
返回 反映。的valueOf(STRCONV。FormatInt(在。诠释(),10) ),nil
})
如果源结构上的整数字段与目标结构上的字符串字段的名称匹配,则将调用提供的Converter方法。

请注意,如果要注册从int到的转换器,string则必须提供指向指针的指针作为目标类型((*string)(nil) )。

可以在AddConversion godoc中找到更多示例。

版本控制
go-model根据语义版本发布版本

gopkg.in/jeevatkm/go-model.vX指向适当的标签版本;X表示版本号,是一个稳定的版本。建议使用版本,例如。gopkg.in/jeevatkm/go-model.v0。开发在master分支上进行。尽管master中的代码应始终能够成功编译和测试,但它可能会破坏API。我们旨在保持向后兼容性,但可能会更改API和行为以修复错误。