av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

問個(gè)Go問題,字符串len==0和字符串=="",有啥區(qū)別?

本文轉(zhuǎn)載自微信公眾號(hào)「 腦子進(jìn)煎魚了」,作者陳煎魚 。轉(zhuǎn)載本文請(qǐng)聯(lián)系 腦子進(jìn)煎魚了公眾號(hào)。

成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括泗陽網(wǎng)站建設(shè)、泗陽網(wǎng)站制作、泗陽網(wǎng)頁制作以及泗陽網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,泗陽網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到泗陽省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

大家好,我是煎魚。

前幾天在微信群看到幾位大佬在討論一個(gè) Go 語言相關(guān)的問題:字符串 len == 0 和 字符串 == "",有啥區(qū)別?“

這是一個(gè)比較小的細(xì)節(jié)點(diǎn),同時(shí)也勾起了我的好奇心,因此今天這篇文章就和大家一起研究一下他們兩者有沒有區(qū)別,誰的性能更好一些?

建議在此處先自行思考一下,在心里給出自己的答案。

測(cè)試方法

在測(cè)試的方法中,我們分別聲明了 Test1 和 Test2 方法:

 
 
 
  1. func Test1() bool { 
  2.  var v string 
  3.  if v == "" { 
  4.   return true 
  5.  } 
  6.  return false 
  7.  
  8. func Test2() bool { 
  9.  var v string 
  10.  if len(v) == 0 { 
  11.   return true 
  12.  } 
  13.  return false 

在方法內(nèi)部僅做了簡單的變量類型聲明,分別以 字符串 == "" 和 字符串 len == 0 為判斷依據(jù)。

測(cè)試用例

編寫兩個(gè)方法的 Benchmark,用于后續(xù)的性能測(cè)試:

 
 
 
  1. func BenchmarkTest1(b *testing.B) { 
  2.  for i := 0; i < b.N; i++ { 
  3.   Test1() 
  4.  } 
  5.  
  6. func BenchmarkTest2(b *testing.B) { 
  7.  for i := 0; i < b.N; i++ { 
  8.   Test2() 
  9.  } 

結(jié)果分析

 
 
 
  1. $ go test --bench=. -benchmem 
  2. goos: darwin 
  3. goarch: amd64 
  4. BenchmarkTest1-4    1000000000          0.305 ns/op        0 B/op        0 allocs/op 
  5. BenchmarkTest2-4    1000000000          0.305 ns/op        0 B/op        0 allocs/op 
  6. PASS 
  7. ok   _/Users/eddycjy/go-application/awesomeProject/tests 0.688s 

從多次測(cè)試的結(jié)果來看,兩者比較:

性能幾乎沒有區(qū)別,甚至可以出現(xiàn)一模一樣的情況。

均不涉及內(nèi)存申請(qǐng)和操作,均為 0/op。說明變量并不是聲明了,就有初始化動(dòng)作的,這塊 Go 編譯器有做優(yōu)化。

結(jié)果上居然是一樣的。根據(jù)曹大的提示,我們可以進(jìn)一步看一下兩者的匯編代碼,看看具體區(qū)別在哪里:

 
 
 
  1. $ go tool compile -S main.go 
  2. "".main STEXT nosplit size=1 args=0x0 locals=0x0 
  3.  0x0000 00000 (main.go:3) TEXT "".main(sb), NOSPLIT|ABIInternal, $0-0 
  4.  0x0000 00000 (main.go:3) FUNCDATA $0, gclocals·33cdeccccebe80329f1fdbee7f5874cb(sb) 
  5.  0x0000 00000 (main.go:3) FUNCDATA $1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(sb) 
  6.  0x0000 00000 (main.go:5) RET 
  7.  0x0000 c3                                               . 
  8. go.cuinfo.packagename. SDWARFINFO dupok size=0 
  9.  0x0000 6d 61 69 6e                                      main 
  10. ""..inittask SNOPTRDATA size=24 
  11.  0x0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 
  12.  0x0010 00 00 00 00 00 00 00 00                          ........ 
  13. gclocals·33cdeccccebe80329f1fdbee7f5874cb SRODATA dupok size=8 
  14.  0x0000 01 00 00 00 00 00 00 00    

無論是 len(v) == 0,又或是 v == "" 的判斷,其編譯出來的匯編代碼都是完全一致的??梢悦鞔_ Go 編譯器在這塊做了明確的優(yōu)化,大概率是直接比對(duì)了。

因此在 Go 語言中 字符串 len == 0 和 字符串 == "" 的判定,這兩者可以認(rèn)為是沒有區(qū)別的。


網(wǎng)站名稱:問個(gè)Go問題,字符串len==0和字符串=="",有啥區(qū)別?
瀏覽地址:http://uogjgqi.cn/article/cddhhdi.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流