這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
先說結論:大Golang裡面,如果一個Null 字元串通過strings包的Split函數進行切割,那麼結果是一個長度為1的數組,裡面的內容是一個Null 字元串。
為了驗證,分別在1.0.1、1.1、1.2.2、1.3.3、1.4rc上面進行了測試,驗證了上面的結論是正確的。
func main() {a := strings.Split("", ";")fmt.Printf("%d****%s****\n", len(a), a[0])}
這個也很好理解。切割一個Null 字元串,肯定是沒辦法切的,那麼結果就是沒切開,把原字串直接加入結果數組裡面而已。只不過一開始有點難理解,因為我們都會認為如果是Null 字元串去切,結果數組裡應該是空的。
最近升級了beego1.4.2,謝大把beego控制器擷取請求參數函數Controller.GetInt函數的傳回值,由之前的int64改成了int,本來最早用的時候就彆扭,如果想取到int64,那直接再加個函數Controller.GetInt64就可以了,結果這麼一搞,還得自己惦記著。結果這次謝大果斷把Controller.GetInt傳回值改了,項目直接編譯不過了。
當然,這不算什麼,編譯不過最起碼知道問題出在哪裡了。還有一個坑,beego.AppConfig.Strings函數,之前是可以將配置裡的字串通過分號自動切割成數組。結果更新之後,之前的代碼返回是空的了(也就是裡面是長度是1的Null 字元串)。這個可害苦了我。看了下源碼,發現config包解析設定檔的方法進行了大幅度更新,但是我經過分析,認為並不是這裡的錯誤,反而是另一個地方beego/config.go第111行
func (b *beegoAppConfig) Strings(key string) []string {v := b.innerConfig.Strings(RunMode + "::" + key)if len(v) == 0 {return b.innerConfig.Strings(key)}return v}
從runmode裡擷取配置的值,如果沒有取到,去取預設值。這裡說一下,beego的設定檔支援dev、prod和default三種模式。如果配置了runmode,根據其在設定檔內尋找相應的配置,否則去取預設值。上面的代碼大體是這個含義。但是如果沒有找到runmode下的配置,此時if的判斷是len(v) == 0,而之前從設定檔的實現ini.go裡取值的函數如下:
func (c *IniConfigContainer) Strings(key string) []string {return strings.Split(c.String(key), ";")}
它會把取到的字串進行切割,結合我們上面提到的,無論怎麼切割,長度最少是1,所以if判斷永遠是false,取預設值的邏輯永遠不會被執行。修改的方法也很簡單,判斷語言改成if v[0] == ""即可。完成的beego/config包介紹可以看我之前的文章。我已經給謝大提了Merge Request,但是他一直沒有理我。。。
24號謝大合并了My Code,開心開心開心。
本文所涉及到的完整源碼請參考。
原文連結:Golang字串切割函數Split,轉載請註明來源!