beego提供了一套web開發的框架。但我們在開發過程中遇到了一些問題,現匯總如下。
測試1:測試只有keys數組的情況
func (this *TestController) Index() { 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
結果:[] 0
反復測試多次,結果相同
測試2:測試有keys數組還有vals數組的情況
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)) }
測試結果:
url:http://api.query.qihoo.net:8090/test/index?keys[]=test&keys[]=test&vals[]=test&vals[]=test
[] [] 0 0
多次測試,結果相同
測試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,需要手工轉化。