Golang实践录:接口文档字段转结构体定义

本文给出一个从接口文档字段说明文字转换成golang结构体的方法。

问题提出

近期使用golang完成一个数据传输的工程的编写,难度不大,但接口较多,每个接口传输的字段都不少,最多的接口字段,有超过150个。这些字段在查询数据库和发送数据都用到------只是部分字段名称不同,为方便起见,同一接口的数据统一用一个结构体传递------golang支持不同类型的名称。手工一一拷贝比较耗时,于是写了个小代码进行转换。由于接口文档是word格式,可以直接拷贝表格内容到文本文件,再转换。

实现思路和代码

word文档里字段的说明是表格形式的,拷贝出来后变成了tab,为方便起见,需要兼容tab和空格两种形式。golang结构体支持不同类型的名称,具体来说,在结构体中使用db指定查询数据库的名称,使用json指定序列化的字段。

由于接口文档字段使用的类型与golang定义类型不同,如文档里类型为Integer,实际对应golang里的int,这些不同之处,单独列出判断即可。另外要提的是,golang结构体变量第一个字符必须大写,因此要处理这种情况。

如果接口文档的字段是对象类型,或者数据库字段名称和文档名称不同,则要手动修改,但所遇不多。总体上,一个接口的数据统一一种格式,多元一体,大大提高效率。

代码如下:

复制代码
type MyConvertStruct_t struct {
	Type1 string
	Type2 string
}

var arrType []MyConvertStruct_t = []MyConvertStruct_t{
	{"String", "string"},
	{"Integer", "int"},
	{"Long", "int"},
}

func makeComment(name string) (ret string) {

	ret = fmt.Sprintf("`json:\"%v\" db:\"%v\"`", name, name)

	return
}

func main() {
	filePath := "tmp.txt"
	csvbuf, err := com.ReadTabFile(filePath)
	if err != nil {
		fmt.Println("打开文件失败:", err)
		return
	}

	typeMap := make(map[string]string)
	for _, item := range arrType {
		typeMap[item.Type1] = item.Type2
	}

	fmt.Println("------------------------------")
	for _, row := range csvbuf {
		name := row[0]
		name = strings.TrimSpace(name)
		myType := row[2]
		if value, exists := typeMap[row[2]]; exists {
			myType = value
		}
		comment := makeComment(name)
		// name字段,第一个字符大写
		name = strings.Title(name)
		fmt.Printf("%v %v %v\n", name, myType, comment)
	}
}

测试

输入文件tmp.txt内容如下:

复制代码
id ID值	String	0
num   	数字	Integer	0
etype	类型	Integer	 0
timestamp	时间	String	0
mCode	号码	String	0
mName	姓名	String	0
age       XX	String	0
addr	地址	String	0
mac	MAC名称	String	0
remark	备注	String	0

注意,上述文件内容使用空格或tab键将不同内容分隔。执行程序后,在终端输出信息如下:

复制代码
------------------------------
Id string `json:"id" db:"id"`
Num int `json:"num" db:"num"`
Etype int `json:"etype" db:"etype"`
Timestamp string `json:"timestamp" db:"timestamp"`
MCode string `json:"mCode" db:"mCode"`
MName string `json:"mName" db:"mName"`
Age string `json:"age" db:"age"`
Addr string `json:"addr" db:"addr"`
Mac string `json:"mac" db:"mac"`
Remark string `json:"remark" db:"remark"`

小结

从输出结果可以看到,变量名称首字符大写,也生成了jsondb两种格式的字段。符合预期。

相关推荐
寻星探路1 分钟前
【Python 全栈测开之路】Python 进阶:库的使用与第三方生态(标准库+Pip+实战)
java·开发语言·c++·python·ai·c#·pip
SmartRadio8 小时前
CH585M+MK8000、DW1000 (UWB)+W25Q16的低功耗室内定位设计
c语言·开发语言·uwb
rfidunion8 小时前
QT5.7.0编译移植
开发语言·qt
rit84324998 小时前
MATLAB对组合巴克码抗干扰仿真的实现方案
开发语言·matlab
大、男人9 小时前
python之asynccontextmanager学习
开发语言·python·学习
hqwest9 小时前
码上通QT实战08--导航按钮切换界面
开发语言·qt·slot·信号与槽·connect·signals·emit
AC赳赳老秦9 小时前
DeepSeek 私有化部署避坑指南:敏感数据本地化处理与合规性检测详解
大数据·开发语言·数据库·人工智能·自动化·php·deepseek
不知道累,只知道类10 小时前
深入理解 Java 虚拟线程 (Project Loom)
java·开发语言
国强_dev10 小时前
Python 的“非直接原因”报错
开发语言·python
YMatrix 官方技术社区10 小时前
YMatrix 存储引擎解密:MARS3 存储引擎如何超越传统行存、列存实现“时序+分析“场景性能大幅提升?
开发语言·数据库·时序数据库·数据库架构·智慧工厂·存储引擎·ymatrix