beego提供了一套web開發的框架。但咱們在開發過程當中遇到了一些問題,現彙總以下。php
測試1:測試只有keys數組的狀況web
func (this *TestController) Index() { keys := make([]string, 0) this.Ctx.Input.Bind(&keys, "keys") fmt.Println(keys, len(keys)) }
測試結果:api
url:http://api.query.qihoo.net:8090/test/index?keys[]=test&keys[]=test數組
結果:[] 0框架
反覆測試屢次,結果相同測試
測試2:測試有keys數組還有vals數組的狀況ui
func (this *TestController) Index() { keys := make([]string, 0) this.Ctx.Input.Bind(&keys, "keys") var vals map[]string vals = make(map[]string, 0) this.Ctx.Input.Bind(&vals, "vals") fmt.Println(keys, vals, len(keys), len(vals)) }
測試結果:this
url:http://api.query.qihoo.net:8090/test/index?keys[]=test&keys[]=test&vals[]=test&vals[]=test編碼
[] [] 0 0url
屢次測試,結果相同
測試3:測試有keys數組,有test字符串
func (this *TestController) Index() { var test string this.Ctx.Input.Bind(&test, "test") fmt.Println(test) keys := make([]string, 0) this.Ctx.Input.Bind(&keys, "keys") fmt.Println(keys, len(keys)) }
測試url:http://api.query.qihoo.net:8090/test/index?keys[]=test&keys[]=test
輸出:gotest:reflect.Set: value of type int is not assignable to type string
測試url:http://api.query.qihoo.net:8090/test/index?keys[]=test&keys[]=test&test=
輸出:gotest:reflect.Set: value of type int is not assignable to type string
測試url:http://api.query.qihoo.net:8090/test/index?keys[]=test&keys[]=test&test=test
輸出:
test
[test test] 2
測試4:有keys數組,有test字符串,用GetString來獲取test
func (this *TestController) Index() { var test string test = this.GetString("test") fmt.Println(test) keys := make([]string, 0) this.Ctx.Input.Bind(&keys, "keys") fmt.Println(keys, len(keys)) }
測試url:http://api.query.qihoo.net:8090/test/index?keys[]=test&keys[]=test&test=test
結果:
test
[test test] 2
測試url:http://api.query.qihoo.net:8090/test/index?keys[]=test&keys[]=test
結果:
[test test] 2
進一步測試
測試4:
func (this *TestController) Index() { var test string test = this.GetString("test") fmt.Println(test) keys := make([]string, 0) this.Ctx.Input.Bind(&keys, "keys") fmt.Println(keys, len(keys)) }
接下來的測試不會設置test,輸出結果也不包含test的輸出
測試url:http://api.query.qihoo.net:8090/test/index?keys[]=test&keys[]=test
輸出:[test test] 2
測試url:http://api.query.qihoo.net:8090/test/index?keys[]=test&keys[]=
輸出:[test ] 2
測試url:http://api.query.qihoo.net:8090/test/index?keys[0]=test&keys[1]=test
輸出:[test test] 2
測試url:http://api.query.qihoo.net:8090/test/index?keys[0]=test&keys[1]=
輸出:gotest:reflect.Set: value of type int is not assignable to type string
測試url:http://api.query.qihoo.net:8090/test/index?keys[]=test&keys[]=test&keys[0]=test&keys[1]=test
輸出:[test test test test] 4
測試url:http://api.query.qihoo.net:8090/test/index?keys[]=test&keys[]=test&keys[0]=test&keys[1]=test&keys[2]=
輸出:gotest:reflect.Set: value of type int is not assignable to type string
測試url:http://api.query.qihoo.net:8090/test/index?keys[]=test&keys[]=&keys[0]=test&keys[1]=test&keys[2]=test
輸出:[test test test test ] 5
測試結果顯示:
使用beego框架,想要獲取數組必須具有幾個條件:
1,必須有非數組的變量存在(string能夠,其它類型int-bool等的沒作測試),若是沒有單個變量只有數組(不管是單個數組或者多個數組)則全部的數組獲均取不到元素;
2,若是url是keys[1]=test&keys[2]=test這樣的,必定得保證每一個項都要有值,不能爲空,也就是不能存在keys[1]=這樣的項
注意事項:
非數組的單個變量若是不肯定的話,最好用GetString,GetString不論該變量是否在url中被設置都能正常工做。若是用Bind,必定要保證該變量是有值的,不然報錯
容許這樣的url:keys[]=test&keys[]=,不容許keys[2]這樣的url:keys[0]=test&keys[1]=test&keys[2]=
實際開發中:
1,注意事項1很是有用,咱們能夠用一行代碼完成:var _ = this.GetString("test")
2,php的http_huild_query處理後的url是進行了urlencode編碼,並且數組是帶下標的(相似於keys[0]=1&keys[1]=2),從0開始編號。大部分工做正常,在值爲空字符串是會有問題(keys[0]=test&keys[1]=test&keys[2]=),咱們如何處理這部分狀況呢?以下實驗給出告終論:用map[string]string而不是[]string
繼續作實驗。
實驗5:
func (this *TestController) Index() { var _= this.GetString("test") var keys map[string]string keys = make(map[string]string, 0) this.Ctx.Input.Bind(&keys, "keys") fmt.Println(keys, len(keys)) }
測試url:http://api.query.qihoo.net:8090/test/index?keys[0]=test&keys[1]=test&keys[2]=test
結果:map[0:test 1:test 2:test] 3
測試url:http://api.query.qihoo.net:8090/test/index?keys[0]=test&keys[1]=test&keys[2]=
結果:map[0:test 1:test 2:] 3
測試url:http://api.query.qihoo.net:8090/test/index?keys[0]=test&keys[1]=test&keys[2]=test&keys[]=100
結果:map[0:test 1:test 2:test :100] 4
咱們看到用map[string]string來代替[]string可以解決報錯的問題,同時也有侷限:再也不兼容keys[]這樣的數組元素。
因此區分兩種不兼容的使用場景,只能取其中一種用:1,數組元素所有用keys[],而且不容許任意一個keys[]有空值,可用[]string的Bind;2,數組元素所有用keys[0],keys[1],keys[2],容許有空值,map[string]string的Bind,若是要用數組而不是map,須要手工轉化。