目录

golang的结构体要求首字母大写,而经常又需要填写tag,声明json小写输出,所以在存在大量字段的接口,定义一个struct,需要重复填写大量字段,繁琐又浪费时间,还容易手工错漏。

为了提高定义struct的声明编码效率与正确性,根据文档实际情况简单写个工具:

读取文档参数文本内容

比如以拼多多api为例:https://open.pinduoduo.com/application/document/api?id=pdd.ddk.goods.search

activity_tags	INTEGER[]		商品活动标记数组,例:[4,7],4-秒杀 7-百亿补贴等
activity_type	INTEGER		活动类型,0-无活动;1-秒杀;3-限量折扣;12-限时折扣;13-大促活动;14-名品折扣;15-品牌清仓;16-食品超市;17-一元幸运团;18-爱逛街;19-时尚穿搭;20-男人帮;21-9块9;22-竞价活动;23-榜单活动;24-幸运半价购;25-定金预售;26-幸运人气购;27-特色主题活动;28-断码清仓;29-一元话费;30-电器城;31-每日好店;32-品牌卡;101-大促搜索池;102-大促品类分会场;
cat_ids	LONG[]		商品类目id
clt_cpn_batch_sn	STRING		店铺收藏券id
clt_cpn_discount	LONG		店铺收藏券面额,单位为分
clt_cpn_end_time	LONG		店铺收藏券截止时间
clt_cpn_min_amt	LONG		店铺收藏券使用门槛价格,单位为分
clt_cpn_quantity	LONG		店铺收藏券总量
min_normal_price	LONG		最小单买价格(单位为分)
only_scene_auth	BOOLEAN		快手专享
opt_id	LONG		商品标签ID,使用pdd.goods.opts.get接口获取
opt_ids	LONG[]		商品标签id

处理首字母大写、转换参数类型、补充json tag

基于beego框架下,也可以简单调整转换成命令模式下运行:

package controllers

import (
	"bufio"
	"io"
	"os"
	"pdd-mini-go/common"
	"strings"

	"github.com/beego/beego/v2/core/logs"
	beego "github.com/beego/beego/v2/server/web"
)

// Index Controller
type ToolController struct {
	beego.Controller
}

func init() {
	logs.SetLogger(logs.AdapterFile, `{"filename":"pdd.mini.log"}`)

}

//转换java api文档参数、参数类型为golang的struct结构定义
//比如:https://open.pinduoduo.com/application/document/api?id=pdd.ddk.goods.search
//http://localhost:8080/shehui/tool/struct
// @router /struct [get]
func (tool *ToolController) GenerateStructString() {

	fi, err := os.Open("pdd.txt")
	if err != nil {
		tool.Ctx.WriteString("Error: " + err.Error())
		return
	}
	defer fi.Close()

	br := bufio.NewReader(fi)
	tool.Ctx.WriteString("type data struct{\n")
	for {
		lineBytes, _, c := br.ReadLine()
		if c == io.EOF {
			break
		}
		one := string(lineBytes)
		line := strings.Fields(one)
		line[2] = tool.getStructJsonTag(line[0])
		line[1] = tool.getVarType(line[0], line[1])
		line[0] = common.Capitalize(line[0])
		tool.Ctx.WriteString(line[0] + "\t" + line[1] + "\t" + line[2] + "\n")
	}
	tool.Ctx.WriteString("\n}")
}

//转换api文档上参数类型为golang的参数类型
func (tool *ToolController) getVarType(varName string, varType string) string {
	switch varType {
	case "INTEGER":
		return "int"
	case "LONG":
		return "int64"
	case "STRING":
		return "string"
	case "BOOLEAN":
		return "bool"
	case "INTEGER[]":
		return "[]int"
	case "LONG[]":
		return "[]int64"
	case "STRING[]":
		return "[]string"
	case "BOOLEAN[]":
		return "[]bool"
	case "OBJECT":
		return varName
	case "OBJECT[]":
		return "[]" + varName		
	default:
		return varName
	}
}
func (tool *ToolController) getStructJsonTag(varName string) string {
	return "`json:\"" + varName + "\"`"
}

输出struct内容

type data struct {
	Activity_tags                   []int    `json:"activity_tags"`
	Activity_type                   int      `json:"activity_type"`
	Cat_ids                         []int64  `json:"cat_ids"`
	Clt_cpn_batch_sn                string   `json:"clt_cpn_batch_sn"`
	Clt_cpn_discount                int64    `json:"clt_cpn_discount"`
	Clt_cpn_end_time                int64    `json:"clt_cpn_end_time"`
	Clt_cpn_min_amt                 int64    `json:"clt_cpn_min_amt"`
	Clt_cpn_quantity                int64    `json:"clt_cpn_quantity"`
	Clt_cpn_remain_quantity         int64    `json:"clt_cpn_remain_quantity"`
	Clt_cpn_start_time              int64    `json:"clt_cpn_start_time"`
	Coupon_discount                 int64    `json:"coupon_discount"`
	Coupon_end_time                 int64    `json:"coupon_end_time"`
	Coupon_min_order_amount         int64    `json:"coupon_min_order_amount"`
	Coupon_remain_quantity          int64    `json:"coupon_remain_quantity"`
	Coupon_start_time               int64    `json:"coupon_start_time"`
	Coupon_total_quantity           int64    `json:"coupon_total_quantity"`
	Create_at                       int64    `json:"create_at"`
	Desc_txt                        string   `json:"desc_txt"`
	Extra_coupon_amount             int64    `json:"extra_coupon_amount"`
	Goods_desc                      string   `json:"goods_desc"`
	Goods_image_url                 string   `json:"goods_image_url"`
	Goods_labels                    []int    `json:"goods_labels"`
	Goods_name                      string   `json:"goods_name"`
	Goods_sign                      string   `json:"goods_sign"`
	Goods_thumbnail_url             string   `json:"goods_thumbnail_url"`
	Has_coupon                      bool     `json:"has_coupon"`
	Has_mall_coupon                 bool     `json:"has_mall_coupon"`
	Lgst_txt                        string   `json:"lgst_txt"`
	Mall_coupon_discount_pct        int      `json:"mall_coupon_discount_pct"`
	Mall_coupon_end_time            int64    `json:"mall_coupon_end_time"`
	Mall_coupon_id                  int64    `json:"mall_coupon_id"`
	Mall_coupon_max_discount_amount int      `json:"mall_coupon_max_discount_amount"`
	Mall_coupon_min_order_amount    int      `json:"mall_coupon_min_order_amount"`
	Mall_coupon_remain_quantity     int64    `json:"mall_coupon_remain_quantity"`
	Mall_coupon_start_time          int64    `json:"mall_coupon_start_time"`
	Mall_coupon_total_quantity      int64    `json:"mall_coupon_total_quantity"`
	Mall_cps                        int      `json:"mall_cps"`
	Mall_id                         int64    `json:"mall_id"`
	Mall_name                       string   `json:"mall_name"`
	Merchant_type                   int      `json:"merchant_type"`
	Min_group_price                 int64    `json:"min_group_price"`
	Min_normal_price                int64    `json:"min_normal_price"`
	Only_scene_auth                 bool     `json:"only_scene_auth"`
	Opt_id                          int64    `json:"opt_id"`
	Opt_ids                         []int64  `json:"opt_ids"`
	Opt_name                        string   `json:"opt_name"`
	Plan_type                       int      `json:"plan_type"`
	Predict_promotion_rate          int64    `json:"predict_promotion_rate"`
	Promotion_rate                  int64    `json:"promotion_rate"`
	Sales_tip                       string   `json:"sales_tip"`
	Search_id                       string   `json:"search_id"`
	Service_tags                    []int64  `json:"service_tags"`
	Serv_txt                        string   `json:"serv_txt"`
	Share_rate                      int      `json:"share_rate"`
	Subsidy_amount                  int      `json:"subsidy_amount"`
	Unified_tags                    []string `json:"unified_tags"`
	Zs_duo_id                       int64    `json:"zs_duo_id"`
}

json生成struct

如果有api测试工具,可以提前拿到返回的json结果,我们还可以通过现有的json to struct的工具,直接转换成struct: