Go-swagger生成客户端时移除模型名中的Models前缀
解决Go-Swagger生成客户端时模型名多出Models前缀的问题
问题拆解
你用go-swagger生成客户端代码时,原本Swagger里的models.BaseModel被生成成了models.ModelsBaseModel,核心是模板里的{{.Schema.GoType}}输出带了多余的Models前缀,之前试的sprig字符串函数没生效,大概率是没处理好指针和包名的拆分。
具体解决方案
1. 修复模板的字符串处理逻辑
直接替换模板中{{.Schema.GoType}}的位置,用下面的逻辑拆分类型、移除前缀:
{{- $rawType := .Schema.GoType -}} {{- // 先处理指针情况 }} {{- $isPointer := hasPrefix $rawType "*" -}} {{- $type := trimPrefix $rawType "*" -}} {{- // 拆分包名和类型名 }} {{- $typeParts := split $type "." -}} {{- $pkg := index $typeParts 0 -}} {{- $typeName := index $typeParts 1 -}} {{- // 移除Models前缀 }} {{- $cleanTypeName := trimPrefix $typeName "Models" -}} {{- // 拼接回完整类型,保留指针 }} {{- $result := printf "%s.%s" $pkg $cleanTypeName -}} {{- if $isPointer -}}{{ printf "*%s" $result }}{{- else -}}{{ $result }}{{- end -}}
这段代码会先剥离指针符号,拆分包名和类型名,去掉Models前缀后再拼接回去,完美适配带指针的情况(比如你提到的*models.ModelsBaseResponse)。
2. 直接在Swagger文件指定Go类型名
在你的Swagger定义里给模型加x-go-name扩展字段,强制指定生成的类型名:
definitions: BaseModel: x-go-name: BaseModel type: object properties: # 这里写你的模型属性
这种方式不用改模板,直接通过配置约束生成逻辑,更稳妥。
3. 检查Swagger模型命名
确认你的Swagger文件里模型的定义名称就是BaseModel,别不小心写成了ModelsBaseModel,源头命名错了生成出来肯定不对。
验证步骤
改完模板或Swagger配置后,重新跑生成命令:
swagger generate client -f 你的swagger文件路径 -t ./client
去生成的代码里检查模型引用,应该已经变成models.BaseModel了。
内容的提问来源于stack exchange,提问作者Siddharth Kumar Shukla
相关产品推荐
相关产品推荐

