根据go结构体反编译生成proto的message

咋一看标题, 这个有啥用?

你别说还真有用, 当你想重构你的项目的时候, 或者你想rpc调用其他语言时, 这个就不用你一个一个去编写message了,而是根据你的go结构体直接生成, 简洁高效(好吧, 一般人也不会有这种需求, 有也直接发给ai就行, 不过各位看官就当看个乐子, 学习下也可以)

实现原理

思路

随机读取包含go的结构体文件, 然后读取每个结构的内容, 以及结构体名字, 通过fmt.Sprintf嵌入到准备好的模板中, 生成新的可执行go文件, 这样就可以生成proto文件了

实现代码

定义proto结构体, 方便后续调用操作

// Proto 结构体用于生成 Protobuf 描述
type Proto struct {
   
}

// NewProto 创建一个新的 Proto 实例
func NewProto() *Proto {
   
    return &Proto{
   }
}

读取go 文件, 根据type 分割 go 结构体,

// readGoFile 读取 Go 文件并提取结构体定义
func (p *Proto) readGoFile(gopath string) ([]string, error) {
   
    data, err := os.ReadFile(gopath)
    if err != nil {
   
       return nil, err
    }

    datas := strings.Split(strings.TrimSpace(string(data)), "type ")
    for i := 1; i < len(datas); i++ {
   
       datas[i] = "type " + datas[i]
    }

    return datas[1:], nil
}

将分割好的每个结构体依次获取它的结构体名字, 构建到GetStruct放法中, 并将其放到st中, 最后插入模板, 也就是template中, template在文章后面

func (p *Proto) writeGoFile(datas []string, outputGoPath string) error {
   
    template := (放在文章后面)
    st := make([]string, 0)

    for i := 0; i < len(datas); i++ 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ambition!6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值