成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

問個 Go 問題,字符串 len == 0 和 字符串== "" ,有啥區別?

開發 后端
這是一個比較小的細節點,同時也勾起了我的好奇心,因此今天這篇文章就和大家一起研究一下他們兩者有沒有區別,誰的性能更好一些?建議在此處先自行思考一下,在心里給出自己的答案。

[[385917]]

本文轉載自微信公眾號「 腦子進煎魚了」,作者陳煎魚 。轉載本文請聯系 腦子進煎魚了公眾號。

大家好,我是煎魚。

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

這是一個比較小的細節點,同時也勾起了我的好奇心,因此今天這篇文章就和大家一起研究一下他們兩者有沒有區別,誰的性能更好一些?

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

測試方法

在測試的方法中,我們分別聲明了 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 

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

測試用例

編寫兩個方法的 Benchmark,用于后續的性能測試:

  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.  } 

結果分析

  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 

從多次測試的結果來看,兩者比較:

性能幾乎沒有區別,甚至可以出現一模一樣的情況。

均不涉及內存申請和操作,均為 0/op。說明變量并不是聲明了,就有初始化動作的,這塊 Go 編譯器有做優化。

結果上居然是一樣的。根據曹大的提示,我們可以進一步看一下兩者的匯編代碼,看看具體區別在哪里:

  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 編譯器在這塊做了明確的優化,大概率是直接比對了。

 

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

 

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2021-03-08 08:23:24

Java字符串截取

2021-09-10 08:18:31

Go語言字符串

2009-06-23 14:13:00

Java字符串

2024-04-01 08:41:39

字符串.NET

2010-11-26 09:51:54

MySQL字符串

2014-01-02 16:14:10

PostgreSQL字符串

2009-07-16 17:01:09

Swing字符串

2023-01-11 16:49:13

MySQL數據庫

2011-08-10 18:47:18

Cocoa字符串

2023-12-15 09:49:54

回溯解決組合問題數組

2010-09-09 11:48:00

SQL函數字符串

2023-12-11 07:33:05

Go語言字符技巧

2023-01-03 08:07:33

Go字符串指針

2010-07-14 16:48:02

Perl字符串比較

2010-06-28 15:18:51

SQL Server

2010-11-26 10:58:30

MySQL字符串

2010-11-26 13:40:58

MySQL空字符串

2010-07-14 16:21:48

Perl

2022-11-10 07:43:45

2023-08-21 10:28:00

字符串字符Python
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕在线第二页 | 亚洲视频免费在线播放 | 午夜a区 | 国产主播第一页 | 国产精品99久久久久久人 | 一级片aaa| www.性色 | 粉嫩av在线 | 日韩一区二区三区av | 蜜桃视频成人 | 久久视频精品 | 亚洲精品国产偷自在线观看 | 欧美精品1区 | 欧美精品导航 | 国产精品久久久久久婷婷天堂 | 日一日操一操 | 国产欧美日韩一区二区三区在线 | 精品九九 | 日本一区二区在线视频 | 欧洲精品在线观看 | 亚洲欧美视频 | 毛片a | 国产免费看 | 可以在线看的黄色网址 | 九色91视频| 国产精品一区久久久久 | 婷婷久久精品一区二区 | 久久久精品网站 | 国产精品成人一区二区 | 久久新视频 | 亚洲国产日本 | 亚洲成人高清 | 久久精品国产亚洲一区二区 | 欧美激情视频一区二区三区在线播放 | ririsao久久精品一区 | 狠狠狠干 | 91小视频在线 | 91黄在线观看 | 91视视频在线观看入口直接观看 | 精品久久久久久久久久 | 一级毛片视频 |