分享
  1. 首页
  2. 文章

golang的template试水

ronzhang-536 · · 7644 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

解析xml生成相应的java文件

package gsxdb
import (
 "io"
 "ron.zhang/util/file"
 "ron.zhang/util/str"
 "text/template"
)
//xbean的模板
var xbeanTmplate = `
package xbean;
import xdb.Bean;
public class {{.Name }}Stub extends XbeanAdaptor<{{.Name}}> implements Bean {
 {{range $index,$V:=.Attributes }} 
 private {{.Des }} {{$index}} ;{{print "\n"}} 
 {{end}}
 {{range $index,$V:=.Attributes }} 
 public void set{{Uper $index}} ( {{.Des}} a) {
 this.{{$index}}=a;
 }
 public {{.Des}} get{{Uper $index}} () {
 return this.{{$index}};
 }
 {{end}}
}`
var funcMap = template.FuncMap{
 "Uper": uper,
 "templateType": templateType,
}
func uper(input string) string {
 out, _ := str.FristLetterUper(input)
 return out
}
/*
xtable的访问封装,不直接使用
*/
var xtalbeInterface = `
 {{$keyType:=.KeyType}}
 package xbean;
 {{if .Bean.Attributes}} 
 import xbean.{{.Bean.Name}};
 {{end}}
 public interface {{Uper .Bean.Name }}Provider {
 public {{.Bean.Name}} get({{.KeyType}} key);
 public {{.Bean.Name}} select({{.KeyType}} key);
 public {{.Bean.Name}} new{{.Bean.Name}} ({{.KeyType}} key);
 {{range $index,$V:=.Bean.Attributes }} 
 public {{.Des}} select{{Uper $index}} ({{$keyType}} key);
 {{end}}
 }
`
var xtableProviderImplment = `
 {{$keyType:=.KeyType}}
 {{$TableName:= Uper .Name}}
 package xbean;
 {{if .Bean.Attributes}} 
 import xbean.{{.Bean.Name}};
 {{end}}
 public class {{Uper .Bean.Name }}ProviderImpl implements {{Uper .Bean.Name}}Provider {
 @Override
 public {{.Bean.Name}} get({{.KeyType}} key){
 return xtable.{{$TableName}}.get(key);
 }
 @Override
 public {{.Bean.Name}} select({{.KeyType}} key){
 return xtable.{{$TableName}}.select(key);
 }
 @Override
 public {{.Bean.Name}} new{{.Bean.Name}} ({{.KeyType}} key){
 return xbean.Pod.new{{.Bean.Name}}();
 }
 {{range $index,$V:=.Bean.Attributes }} 
 @Override
 public {{.Des}} select{{Uper $index}} ({{$keyType}} key){
 return xtable.{{$TableName}}.select{{Uper $index}}(key);
 }
 {{end}}
 }
 
`
var xtableProviderTest = `
 {{$keyType:=.KeyType}}
package gsxdb
import (
 "encoding/xml"
 "fmt"
 "io/ioutil"
)
/*
xml对应的bean,需要做个转化,设计的时候考虑不全,做个适配吧
*/
type XmlXdb struct {
 XMLName xml.Name `xml:"xdb"`
 Xbeans []XmlXbean `xml:"xbean,>"`
 Xtables []XmlXtable `xml:"table,>"`
 name2Bean map[string]Xbean
}
type XmlXbean struct {
 Name string `xml:"name,attr"`
 Attributes []XmlAttribute `xml:"variable,>"`
}
type XmlXtable struct {
 Name string `xml:"name,attr"`
 Key string `xml:"key,attr"`
 Value string `xml:"value,attr"`
}
type XmlAttribute struct {
 Value string `xml:"value,attr"`
 Name string `xml:"name,attr"`
 Type string `xml:"type,attr"`
 Key string `xml:"key,attr"`
}
/*
解析xml
*/
func ParserFromFile(name string) (XmlXdb, error) {
 v := XmlXdb{}
 //读取xml数据
 bytes, err := ioutil.ReadFile(name)
 if err != nil {
 panic(err)
 }
 //解析xml,生成结构体
 err = xml.Unmarshal(bytes, &v)
 if err != nil {
 fmt.Printf("error: %v", err)
 return v, err
 }
 return v, nil
}
package gsxdb
import ()
/*
类型接口
*/
type Xtype interface {
 Des() string
 DefaultValue() interface{}
}
type Xmap struct {
 KeyType string
 ValueType string
}
//map类型实现xtype的方法
func (a Xmap) Des() string {
 return "java.util.Map<" + a.KeyType + "," + a.ValueType + ">"
}
func (a Xmap) DefaultValue() interface{} {
 return nullValue()
}
//list类型
type Xlist struct {
 ValueType string
}
//list类型实现xtype的方法
func (a Xlist) Des() string {
 return "java.util.List<" + a.ValueType + ">"
}
func (a Xlist) DefaultValue() interface{} {
 return nullValue()
}
type XInt struct {
 XstrType
}
func (a XInt) DefaultValue() interface{} {
 return zeroInt()
}
type XLong struct {
 XstrType
}
func (a XLong) DefaultValue() interface{} {
 return zeroLong()
}
type XstrType string
//list类型实现xtype的方法
func (a XstrType) Des() string {
 return string(a)
}
func (a XstrType) DefaultValue() interface{} {
 return nullValue()
}
type Xbean struct {
 Name string
 Attributes map[string]Xtype
}
type XbeanProvider struct {
 Name string
 Bean Xbean
 KeyType string
}
var zeroInt = func() interface{} {
 return 0
}
var zeroLong = func() interface{} {
 return "0l"
}
var nullValue = func() interface{} {
 return "null"
}

 {{$TableName:= Uper .Name}}
 package xbean;
 {{if .Bean.Attributes}} 
 import xbean.{{.Bean.Name}};
 {{end}}
 public class {{Uper .Bean.Name }}ProviderTest implements {{Uper .Bean.Name}}Provider {
 private java.util.Map<{{templateType .KeyType}},{{.Bean.Name}}> containers=new java.util.HashMap<{{templateType .KeyType}},{{.Bean.Name}}>();
 @Override
 public {{.Bean.Name}} get({{.KeyType}} key){
 return containers.get(key);
 }
 @Override
 public {{.Bean.Name}} select({{.KeyType}} key){
 return containers.get(key);
 }
 public {{.Bean.Name}} new{{.Bean.Name}} ({{.KeyType}} key){
 return xbean.Pod.new{{.Bean.Name}}();
 }
 {{range $index,$V:=.Bean.Attributes }} 
 @Override
 public {{.Des}} select{{Uper $index}} ({{$keyType}} key){
 if (containers.containsKey( key)) {
 return containers.get(key).get{{Uper $index}}();;
 }
 
 return {{ .DefaultValue}};
 }
 {{end}}
 }
 
`
/*
生成xbean的stub文件
*/
func GenXBean(bean Xbean, writer io.Writer) {
 tpl, err := template.New("data").Funcs(funcMap).Parse(xbeanTmplate)
 if err != nil {
 panic(nil)
 }
 tpl.Execute(writer, bean)
}
/*
生成表的数据
*/
func GenXBeanProvider(bean XbeanProvider, templatStr string, writer io.Writer) {
 tpl, err := template.New("data").Funcs(funcMap).Parse(templatStr)
 if err != nil {
 panic(nil)
 }
 tpl.Execute(writer, bean)
}
/*
生成java文件
*/
func (a *XmlXdb) Gen() {
 a.transBeans()
 //生成Xbean
 for _, value := range a.name2Bean {
 GenXBean(value, file.CreateFileR("./src/xbean", value.Name+".java"))
 }
 //生成Xtables
 var provider XbeanProvider
 for _, value := range a.Xtables {
 provider = a.tranTable(value)
 GenXBeanProvider(provider, xtalbeInterface, file.CreateFileR("../gs/src/xbean", provider.Bean.Name+"Provider.java"))
 GenXBeanProvider(provider, xtableProviderImplment, file.CreateFileR("../gs/src/xbean", provider.Bean.Name+"ProviderImpl.java"))
 GenXBeanProvider(provider, xtableProviderTest, file.CreateFileR("./src/xbean", provider.Bean.Name+"ProviderTest.java"))
 }
}
func (a XmlXdb) tranTable(input XmlXtable) XbeanProvider {
 provider := XbeanProvider{}
 provider.Name = input.Name
 provider.KeyType = input.Key
 bean, has := a.name2Bean[input.Value]
 if has {
 provider.Bean = bean
 } else {
 provider.Bean = Xbean{input.Value, nil}
 }
 return provider
}
//初始化函数
func (a *XmlXdb) transBeans() {
 if a.name2Bean != nil {
 return
 }
 //初始化转换字典
 a.name2Bean = make(map[string]Xbean, len(a.Xbeans))
 for _, v := range a.Xbeans {
 if _, b := a.name2Bean[v.Name]; !b {
 a.name2Bean[v.Name] = tranBean(v)
 }
 }
}
func tranBean(input XmlXbean) Xbean {
 bean := Xbean{}
 bean.Name = input.Name
 bean.Attributes = make(map[string]Xtype, len(input.Attributes))
 for _, value := range input.Attributes {
 bean.Attributes[value.Name] = caseType(value)
 }
 return bean
}
/*
类型做个适配
*/
func caseType(inut XmlAttribute) Xtype {
 switch inut.Type {
 case "vector", "list":
 return Xlist{templateType(inut.Value)}
 case "map":
 return Xmap{templateType(inut.Key), templateType(inut.Value)}
 case "int":
 return XInt{XstrType(inut.Type)}
 case "long":
 return XLong{XstrType(inut.Type)}
 default:
 return XstrType(inut.Type)
 }
}
func templateType(input string) string {
 switch input {
 case "long":
 return "Long"
 case "int":
 return "Integer"
 default:
 return input
 }
}

有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:ronzhang-536

查看原文:golang的template试水

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
7644 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏