<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Go Revel - main函數分析

      運行revel命令時,首先會編譯整個項目,在編譯時,會根據`app.conf`配置文件生成兩個源碼文件`tmp/main.go`、`routes/routes.go`,其中`main.go`是整個項目的入口。 ## main.go與routes.go源碼生成過程 ![golang_jsonrpc_server](http://images.cnblogs.com/cnblogs_com/hangxin1940/508415/o_golang-revel-build.png "golang_jsonrpc_server") 源碼在revel的`revel/harness`包。 https://github.com/robfig/revel/blob/master/harness/build.go `main.go`的生成比較重要,而`routes.go`源碼則是完全根據`conf/routes`配置文件的規則生成。 ---------- ## main.go分析 這里以booking示例項目為例子。 **包的導入** 模板: import ( "flag" "reflect" "github.com/robfig/revel"{{range $k, $v := $.ImportPaths}} {{$v}} "{{$k}}"{{end}} ) 渲染后: import ( "flag" "reflect" "github.com/robfig/revel" _ "booking/app" controllers "booking/app/controllers" _ "booking/app/jobs" tests "booking/tests" _ "github.com/mattn/go-sqlite3" controllers0 "github.com/robfig/revel/modules/jobs/app/controllers" _ "github.com/robfig/revel/modules/jobs/app/jobs" controllers2 "github.com/robfig/revel/modules/static/app/controllers" _ "github.com/robfig/revel/modules/testrunner/app" controllers1 "github.com/robfig/revel/modules/testrunner/app/controllers" models "github.com/robfig/revel/samples/booking/app/models" ) 這里動態的渲染出需要導入的包,必要時使用別名,導入包由`calcImportAliases`方法生成。 **注冊控制器** `mian`中進行控制器(controller)的注冊 模板: {{range $i, $c := .Controllers}} revel.RegisterController((*{{index $.ImportPaths .ImportPath}}.{{.StructName}})(nil), []*revel.MethodType{ {{range .MethodSpecs}}&revel.MethodType{ Name: "{{.Name}}", Args: []*revel.MethodArg{ {{range .Args}} &revel.MethodArg{Name: "{{.Name}}", Type: reflect.TypeOf((*{{index $.ImportPaths .ImportPath | .TypeExpr.TypeName}})(nil)) },{{end}} }, RenderArgNames: map[int][]string{ {{range .RenderCalls}} {{.Line}}: []string{ {{range .Names}} "{{.}}",{{end}} },{{end}} }, }, {{end}} }) {{end}} 渲染后: ... revel.RegisterController((*controllers.Hotels)(nil), []*revel.MethodType{ &revel.MethodType{ Name: "Index", Args: []*revel.MethodArg{ }, RenderArgNames: map[int][]string{ 37: []string{ "bookings", }, }, }, &revel.MethodType{ Name: "List", Args: []*revel.MethodArg{ &revel.MethodArg{Name: "search", Type: reflect.TypeOf((*string)(nil)) }, &revel.MethodArg{Name: "size", Type: reflect.TypeOf((*int)(nil)) }, &revel.MethodArg{Name: "page", Type: reflect.TypeOf((*int)(nil)) }, }, RenderArgNames: map[int][]string{ 58: []string{ "hotels", "search", "size", "page", "nextPage", }, }, }, &revel.MethodType{ Name: "Show", Args: []*revel.MethodArg{ &revel.MethodArg{Name: "id", Type: reflect.TypeOf((*int)(nil)) }, }, RenderArgNames: map[int][]string{ 89: []string{ "title", "hotel", }, }, }, &revel.MethodType{ Name: "Settings", Args: []*revel.MethodArg{ }, RenderArgNames: map[int][]string{ 93: []string{ }, }, }, &revel.MethodType{ Name: "SaveSettings", Args: []*revel.MethodArg{ &revel.MethodArg{Name: "password", Type: reflect.TypeOf((*string)(nil)) }, &revel.MethodArg{Name: "verifyPassword", Type: reflect.TypeOf((*string)(nil)) }, }, RenderArgNames: map[int][]string{ }, }, &revel.MethodType{ Name: "ConfirmBooking", Args: []*revel.MethodArg{ &revel.MethodArg{Name: "id", Type: reflect.TypeOf((*int)(nil)) }, &revel.MethodArg{Name: "booking", Type: reflect.TypeOf((*models.Booking)(nil)) }, }, RenderArgNames: map[int][]string{ 144: []string{ "title", "hotel", "booking", }, }, }, &revel.MethodType{ Name: "CancelBooking", Args: []*revel.MethodArg{ &revel.MethodArg{Name: "id", Type: reflect.TypeOf((*int)(nil)) }, }, RenderArgNames: map[int][]string{ }, }, &revel.MethodType{ Name: "Book", Args: []*revel.MethodArg{ &revel.MethodArg{Name: "id", Type: reflect.TypeOf((*int)(nil)) }, }, RenderArgNames: map[int][]string{ 163: []string{ "title", "hotel", }, }, }, }) ... `RegisterController`接受兩個參數,`(c interface{}, methods []*MethodType)`,代碼中,第一個參數傳入`(*controllers.Hotels)(nil)`,其實是一個`controllers.Hotels`類型的空指針,方法內部會根據這個類型指針獲取這個controller的結構名;第二個參數為這個controller所有Action的集合 `[]*MethodType`。 每一個`MethodType`對應一個Action, Action即符合綁定于`controller`并且暴露出來而且返回值為`revel.Result`的方法,參數不限。 例如: // Action &revel.MethodType{ // Action的名稱,即方法名 Name: "List", // Action所接受的參數,即方法的參數 Args: []*revel.MethodArg{ // 每個參數的變量名稱,以及反射類型 &revel.MethodArg{Name: "search", Type: reflect.TypeOf((*string)(nil)) }, &revel.MethodArg{Name: "size", Type: reflect.TypeOf((*int)(nil)) }, &revel.MethodArg{Name: "page", Type: reflect.TypeOf((*int)(nil)) }, }, // 返回Result時調用Render來渲染模板的參數名 RenderArgNames: map[int][]string{ // 這里獲取了調用Render時源碼中的行號,行號是在異常時顯示出來方便調試定位(感覺是這樣) 58: []string{ "hotels", "search", "size", "page", "nextPage", }, }, }, **注冊驗器** 模板: revel.DefaultValidationKeys = map[string]map[int]string{ {{range $path, $lines := .ValidationKeys}} "{{$path}}": { {{range $line, $key := $lines}} {{$line}}: "{{$key}}",{{end}} },{{end}} } 渲染后: revel.DefaultValidationKeys = map[string]map[int]string{ "booking/app/controllers.Application.SaveUser": { 55: "verifyPassword", 56: "verifyPassword", }, "booking/app/controllers.Hotels.SaveSettings": { 98: "verifyPassword", 100: "verifyPassword", }, "booking/app/models.(*Hotel).Validate": { 19: "hotel.Name", 21: "hotel.Address", 26: "hotel.City", 32: "hotel.State", 38: "hotel.Zip", 44: "hotel.Country", }, "booking/app/models.(*User).Validate": { 28: "user.Username", 36: "user.Name", }, "booking/app/models.Booking.Validate": { 34: "booking.User", 35: "booking.Hotel", 36: "booking.CheckInDate", 37: "booking.CheckOutDate", 39: "booking.CardNumber", 41: "booking.NameOnCard", }, "booking/app/models.ValidatePassword": { 44: "password", }, } 這里注冊了所有的驗證器,并且標記了所有調用驗證器`Validation`方法的地方,包括行號以及傳入的變量名。 **注冊測試用例** 模板: revel.TestSuites = []interface{}{ {{range .TestSuites}} (*{{index $.ImportPaths .ImportPath}}.{{.StructName}})(nil),{{end}} } 渲染后: revel.TestSuites = []interface{}{ (*tests.ApplicationTest)(nil), } 這里僅注冊當前項目的測試用例。 最后一行,`revel.Run(*port)` 開啟服務器監聽,運行server。

      posted on 2013-08-17 01:05  黑暗伯爵  閱讀(2094)  評論(0)    收藏  舉報

      導航

      主站蜘蛛池模板: 国产午夜福利视频在线| 性欧美vr高清极品| 久久婷婷综合色丁香五月| 丁香五月亚洲综合在线国内自拍| 亚洲综合色婷婷中文字幕| 久久经精品久久精品免费观看| 中文字幕一区二区三区精华液| 搡老熟女老女人一区二区| 国产成年码av片在线观看 | 人妻熟女av一区二区三区| 亚洲丰满老熟女激情av| 调兵山市| 国产普通话对白刺激| 真实国产老熟女无套中出| 人成午夜免费大片| 少妇人妻偷人精品无码视频新浪| 草草浮力影院| 麻豆天美东精91厂制片| 亚洲男人第一无码av网站| 久久精品女人的天堂av| 日本午夜精品一区二区三区电影 | 手机在线国产精品| 国产精品免费AⅤ片在线观看| 国产精品无码dvd在线观看| 自拍偷拍另类三级三色四色| 亚洲人成网网址在线看| 精品人妻二区中文字幕| 久久国产精品二国产人妻| 亚洲一区二区三区av链接| 久久久国产成人一区二区| 免费人成无码大片在线观看| 九九热免费精品视频在线| 国产欧美日韩亚洲一区二区三区| 国产一区二区在线影院| 精品国产亚洲av麻豆特色| 国产在线无码不卡播放| 久色伊人激情文学你懂的| 国产精品一区二区中文| 99久久激情国产精品| 精品午夜福利在线视在亚洲| 狠狠躁夜夜躁无码中文字幕|