您好,登錄后才能下訂單哦!
這篇文章主要講解了“字符串 len == 0 和 字符串== "" 的區別有哪些”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“字符串 len == 0 和 字符串== "" 的區別有哪些”吧!
在測試的方法中,我們分別聲明了 Test1 和 Test2 方法:
func Test1() bool { var v string if v == "" { return true } return false } func Test2() bool { var v string if len(v) == 0 { return true } return false }
在方法內部僅做了簡單的變量類型聲明,分別以 字符串 == "" 和 字符串 len == 0 為判斷依據。
測試用例
編寫兩個方法的 Benchmark,用于后續的性能測試:
func BenchmarkTest1(b *testing.B) { for i := 0; i < b.N; i++ { Test1() } } func BenchmarkTest2(b *testing.B) { for i := 0; i < b.N; i++ { Test2() } }
結果分析
$ go test --bench=. -benchmem goos: darwin goarch: amd64 BenchmarkTest1-4 1000000000 0.305 ns/op 0 B/op 0 allocs/op BenchmarkTest2-4 1000000000 0.305 ns/op 0 B/op 0 allocs/op PASS ok _/Users/eddycjy/go-application/awesomeProject/tests 0.688s
從多次測試的結果來看,兩者比較:
性能幾乎沒有區別,甚至可以出現一模一樣的情況。
均不涉及內存申請和操作,均為 0/op。說明變量并不是聲明了,就有初始化動作的,這塊 Go 編譯器有做優化。
結果上居然是一樣的。根據曹大的提示,我們可以進一步看一下兩者的匯編代碼,看看具體區別在哪里:
$ go tool compile -S main.go "".main STEXT nosplit size=1 args=0x0 locals=0x0 0x0000 00000 (main.go:3) TEXT "".main(sb), NOSPLIT|ABIInternal, $0-0 0x0000 00000 (main.go:3) FUNCDATA $0, gclocals·33cdeccccebe80329f1fdbee7f5874cb(sb) 0x0000 00000 (main.go:3) FUNCDATA $1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(sb) 0x0000 00000 (main.go:5) RET 0x0000 c3 . go.cuinfo.packagename. SDWARFINFO dupok size=0 0x0000 6d 61 69 6e main ""..inittask SNOPTRDATA size=24 0x0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0x0010 00 00 00 00 00 00 00 00 ........ gclocals·33cdeccccebe80329f1fdbee7f5874cb SRODATA dupok size=8 0x0000 01 00 00 00 00 00 00 00
無論是 len(v) == 0,又或是 v == "" 的判斷,其編譯出來的匯編代碼都是完全一致的。可以明確 Go 編譯器在這塊做了明確的優化,大概率是直接比對了。
因此在 Go 語言中 字符串 len == 0 和 字符串 == "" 的判定,這兩者可以認為是沒有區別的。
感謝各位的閱讀,以上就是“字符串 len == 0 和 字符串== "" 的區別有哪些”的內容了,經過本文的學習后,相信大家對字符串 len == 0 和 字符串== "" 的區別有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。