news 2026/5/4 2:13:22

Go实现java mapstructure的功能

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Go实现java mapstructure的功能

// Mapper 接口(保持原样,用于 PageResult.Convert 方法)
type Mapper interface {
NewRow() any
NewRows() []any
}

// Converter 泛型结构体:T = From/Source, D = To/Destination
type Converter[T any, D any] struct{}

// ========== 单条转换 ==========

// To: T -> D
func (c Converter[T, D]) To(src T) D {
var dst D
gconv.Struct(src, &dst)
return dst
}

// From: D -> T
func (c Converter[T, D]) From(src D) T {
var dst T
gconv.Struct(src, &dst)
return dst
}

// ========== 列表转换 ==========

// ToList: []T -> []D
func (c Converter[T, D]) ToList(src []T) []D {
if len(src) == 0 {
return nil
}
dst := make([]D, len(src))
for i, v := range src {
dst[i] = c.To(v)
}
return dst
}

// FromList: []D -> []T
func (c Converter[T, D]) FromList(src []D) []T {
if len(src) == 0 {
return nil
}
dst := make([]T, len(src))
for i, v := range src {
dst[i] = c.From(v)
}
return dst
}

// ========== 实现 Mapper 接口 ==========

func (c Converter[T, D]) NewRow() any {
var d D
return &d
}

func (c Converter[T, D]) NewRows() []any {
return []any{}
}

// ========== PageResult 转换(包级函数,类型安全) ==========

// PageTo: *PageResult[T] -> *PageResult[D]
func PageTo[T any, D any](p *PageResult[T], c Converter[T, D]) *PageResult[D] {
var ret = NewPageResult[D]()
ret.FromPageResult(p.PageResult)
if !p.ExistRecord() {
return ret
}
ret.Data = c.ToList(p.Data)
return ret
}

// PageFrom: *PageResult[D] -> *PageResult[T]
func PageFrom[T any, D any](p *PageResult[D], c Converter[T, D]) *PageResult[T] {
var ret = NewPageResult[T]()
ret.FromPageResult(p.PageResult)
if !p.ExistRecord() {
return ret
}
ret.Data = c.FromList(p.Data)
return ret
}

// ========== PageResult 方法(兼容旧接口,返回 any) ==========

func (p *PageResult[T]) Convert(m Mapper) *PageResult[any] {
var ret = NewPageResult[any]()
ret.FromPageResult(p.PageResult)
if !p.ExistRecord() {
return ret
}
var data = m.NewRows()
for i := range p.Data {
var row = m.NewRow()
err := gconv.Struct(p.Data[i], row)
if err != nil {
golog.Error("PageResult Convert err:", err)
ret.FailMsg(err.Error())
return ret
}
data = append(data, row)
}
ret.Data = data
return ret
}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/4 2:12:54

实战检验ai编程价值:在快马构建可部署的便签应用,替代cursor成本评估

最近在评估各种AI编程工具的实际价值,特别是像Cursor这样的付费工具是否值得订阅。为了更直观地对比,我决定在InsCode(快马)平台上从零开始构建一个可部署的在线便签应用,通过实战来检验开发效率和成果质量。 项目规划与设计 功能需求分析 这…

作者头像 李华
网站建设 2026/5/4 2:12:13

LinkSwift:八大网盘直链解析工具的完整使用指南与配置手册

LinkSwift:八大网盘直链解析工具的完整使用指南与配置手册 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / …

作者头像 李华
网站建设 2026/5/4 2:10:03

SRv6 的几个小问答

1、在 SRv6 网络中,建立 l2vpn 邻居,和建立 vpnv4 邻居关系的区别?在 SRv6 网络中,如果私网之间要建立通信,如果用 MPLS 单域的话,需要两层标签来传递私网路由:第一层是EBGP 和对端的 CE 产生的…

作者头像 李华
网站建设 2026/5/4 1:54:31

用快马AI快速原型化你的时间管理超级技能应用

今天想和大家分享一个特别实用的开发技巧——如何用InsCode(快马)平台快速搭建时间管理工具的原型。作为一个经常被deadline追着跑的程序员,我发现在这个平台上做原型验证简直像开了"外挂"。 为什么选择时间管理工具作为原型 时间管理是典型的"超级技…

作者头像 李华