只用php做网站,网站设计怎么保持风格一致,百度SEO网站,排版设计图背景
在做一些自动生成的代码工作时#xff0c;有时需要知道方法以及对应的参数名
如果仅是方法#xff0c;利用反射机制就可以解决
而参数名#xff0c;程序编译后#xff0c;已经丢失
可以通过 AST 事先获取方法的参数名
有了方法、参数名#xff0c;加上反射…背景
在做一些自动生成的代码工作时有时需要知道方法以及对应的参数名
如果仅是方法利用反射机制就可以解决
而参数名程序编译后已经丢失
可以通过 AST 事先获取方法的参数名
有了方法、参数名加上反射那么就可以方便生成胶水代码自动集成进 HTTP 、 gRPC 等
获取方法、参数名的例子
下面的例子从特定包 flagInput 特定的结构体 flagStructName 获取该结构体所有的方法以及对应的参数名 conf : packages.Config{Mode: packages.LoadAllSyntax,Tests: false,}packages, err : packages.Load(conf, flagInput)if err ! nil {fmt.Println(Error loading packages:, err)return}allPackages packagesfor _, pkg : range packages {if pkg.Name ! flagPackageName {continue}for _, info : range pkg.TypesInfo.Defs {if info nil {continue}structType, ok : info.Type().(*types.Named)if !ok {continue}if structType.Obj().Name() ! flagStructName {continue}for i : 0; i structType.NumMethods(); i {method : structType.Method(i)methodName : method.Name()if _, ok : excludeMethods[method.Name()]; ok {continue}sig : method.Type().(*types.Signature)params : make([]string, sig.Params().Len())for i : 0; i sig.Params().Len(); i {params[i] sig.Params().At(i).Name()}allMethods[methodName] paramssortMethods append(sortMethods, methodName)}}}可以把这些信息写入 map 声明这样代码里就有类似反射参数的功能了。类似
var methods map[string][]string{Method1: { userid, playerid, otherparam1, otherparam2 },Method2: { userid, playerid },
}集成 HTTP 服务的例子
如有以下类似模板 register.tmpl
func RegisterMethod(engine *gin.Engine) {{{ range .Methods -}}engine.Any(HttpPrefix{{.}}, func(context *gin.Context) { HandleGin(context, {{.}}) }){{ end -}}
}通过类似以下代码 tmpl, err : template.ParseFiles(flagTmpl)if err ! nil {panic(err)}var buf bytes.Buffererr tmpl.Execute(buf, map[string]interface{}{Methods: sortMethods})if err ! nil {panic(err)}就可以自动生成到 HTTP 的胶水代码
func RegisterMethod(engine *gin.Engine) {engine.Any(HttpPrefixMethod1, func(context *gin.Context) { HandleGin(context, Method1) })engine.Any(HttpPrefixMethod2, func(context *gin.Context) { HandleGin(context, Method2) })
}例子中的 HandleGin 函数实现则可以:
利用方法及对应的参数信息获取实际参数值利用反射实现对应结构体函数的调用
其他例子
如生成函数的接口调用说明
模板类似
{{ range .Methods -}}
{{.Index}}.{{.Comment}} http://api/{{.MethodName}}?{{ range $index, $param : .Params }}{{ if $index }}{{ end }}{{ $param }}0{{ end }}
{{ end -}}还是基于上面的获取的方法、参数名的 map 实例信息就可以展开了