Go 語言中的字符串基本操作

這篇文章已經放到騰訊智能工作臺的知識庫啦,鏈接在這里:ima.copilot-Go 入門到入土。要是你有啥不懂的地方,就去知識庫找 AI 聊一聊吧。

本篇將詳細講解 Go 語言中與字符串相關的操作。

1、rune 和 字符串長度

1、Go 函數語法約定

在開始之前,需要注意 Go 語言的一個語法規范。函數或流程控制語句的左花括號 { 必須與函數名或關鍵字在同一行,不能換行書寫。

image.png

這種強制性規定統一了代碼風格,避免了不同開發者因個人習慣造成代碼格式的混亂。

2、len() 計算字符串長度

Go 語言提供了一個內置函數 len(),可以方便地計算出字符串的長度。

image.png

在上述代碼中,len() 函數直接返回了字符串 name 的長度。這是一個非常便捷和常見的操作。

3、len() 的本質:字節數

len() 函數雖然通用,但它返回的是字符串所占的字節數(the number of bytes),而不是字符數。

當字符串只包含英文字母、數字或標準 ASCII 符號時,一個字符恰好占用一個字節,此時字節數等于字符數。但當字符串中包含非 ASCII 字符(如中文、日文等)時,情況就有所不同。

UTF-8 編碼(Go 語言默認的字符串編碼)中:

  • 一個英文字符占用 1 個字節。

  • 一個中文字符通常占用 3 個字節。

image.png

直觀上看,字符串 “叫我阿杰好l” 包含 6 個字符。但 len() 的計算結果為什么是 16 呢? 因為計算的是字節數:1 (l) + 5*3 (叫我阿杰好) = 16 個字節。

4、如何獲取真實的字符數?

在很多業務場景中,我們關心的是字符串實際包含多少個字符,而不是它占用了多少字節。為了解決這個問題,我們需要將字符串轉換為 rune 切片。

rune 類型是 Go 語言中用于表示單個 Unicode 字符的特殊類型。將字符串轉換為 []rune 后,每個中文字符和英文字符都會被當作一個獨立的元素。此時再使用 len() 函數,就能得到準確的字符數量。

image.png

5、總結

在 Go 語言中計算字符串長度時,必須注意以下關鍵點:

  1. 如果你的字符串只包含英文或 ASCII 字符,或者你關心的就是字節長度,可以直接使用 len(str)

  2. 如果你需要知道字符串中實際的字符數量(特別是處理包含中文等多字節字符的場景),必須先將字符串轉換為 rune 切片 []rune(str),然后再對其使用 len() 函數。

掌握這個細節對于正確處理多語言文本至關重要。

2、轉義符詳解

1、 為什么需要轉義符?

假設我們需要定義一個字符串,其內容本身就包含特殊字符,例如雙引號。

如果我們直接這樣編寫代碼:

image.png

編譯器會報錯。因為在 Go 語言中,雙引號用于界定字符串的開始和結束。上述代碼會被編譯器誤解為:第一個字符串是 "Go ",第二個字符串是 "",而中間的 體系課 則是不合法的語法。

為了在字符串內部正確地包含雙引號等特殊字符,我們就需要使用轉義符。

2、使用反斜杠 \ 進行轉義

在 Go 中,反斜杠 \ 是核心的轉義符。當它出現在一個特殊字符前時,它會“轉義”該字符,使其失去原有的特殊含義,而被當作一個普通的字符來處理。

示例:

要在一個由雙引號定義的字符串中包含雙引號,我們可以在內部的雙引號前加上 \

image.png

在這里,\" 被編譯器視為一個整體,并被解釋為單個雙引號字符。

2、使用反引號 ` 創建原生字符串

除了使用轉義符,Go 語言還提供了一種更簡潔的方式來處理包含大量特殊字符的字符串:原生字符串字面量 (Raw String Literal)。這種字符串使用反引號 ` (通常位于鍵盤 Tab 鍵的上方) 來定義。

在反引號包裹的字符串中,所有的字符都按其字面意義進行解釋,無需任何轉義

image.png

這種寫法的輸出結果與使用轉義符完全相同。反引號內的內容可以隨意編寫,包括換行符和雙引號,這與 Python 中的三引號字符串有些類似,非常適合定義多行文本或包含復雜特殊字符的文本。

3、常見的轉義序列

無論是否使用原生字符串,理解并掌握常見的轉義序列都至關重要。轉義符 \ 可以與多個字符組合,形成具有特殊含義的序列。這些序列通常與 ASCII 控制碼相對應。

以下是一些最常用的轉義序列:

|序列|含義|描述|

|—|—|—|

|\n|換行符|將光標移動到下一行的開頭 (Line Feed)|

|\r|回車符|將光標移動到當前行的開頭 (Carriage Return)|

|\t|水平制表符|相當于按下 Tab 鍵,用于對齊文本|

|\\|反斜杠|在字符串中插入一個反斜杠字符 \|

|\"|雙引號|在字符串中插入一個雙引號字符 "|

|\'|單引號|在字符串中插入一個單引號字符 '|

|\?|問號|在字符串中插入一個問號字符 ?|

其中,\r\n 組合(回車并換行)在 Windows 系統中常被用作標準的換行符,而 \n 在 Unix/Linux 和 macOS 中更為常見。

image.png

4、fmt.Printfmt.Println 的區別

在 Go 中,標準庫 fmt 提供了多種打印函數,其中 PrintPrintln 的一個關鍵區別在于是否自動換行。

  • fmt.Println:在打印完所有參數后,會自動在末尾添加一個換行符

  • fmt.Print:僅打印傳入的參數,不會在末尾添加任何內容

image.png

如果我們想用 Print 實現與 Println 相同的換行效果,就需要手動添加轉義符 \n\r\n

image.png

掌握轉義符是 Go 語言編程的基礎。無論是為了在字符串中嵌入特殊字符,還是為了控制輸出格式,理解 \` 的用法都至關重要。在后續的開發中,我們會頻繁地遇到這些概念,熟練運用它們將極大提升編碼效率和代碼的可讀性。

3、格式化輸出

在實際開發中,我們常常需要將不同類型的變量(如字符串、整數、浮點數等)組合成一個完整的字符串進行輸出。

1、字符串拼接的挑戰

使用簡單的 + 號拼接字符串,在處理復雜或多類型數據時會變得非常繁瑣且難以維護。

image.png

可以看到,這種方式不僅代碼可讀性差,還需要手動進行類型轉換(如 strconv.Itoa),非常不便。

2、使用 fmt.Printf 進行格式化輸出

為了解決上述問題,Go 語言提供了 fmt.Printf 函數。它允許我們使用一個模板字符串和一系列占位符(也稱格式化動詞),將變量優雅地嵌入到字符串中。

Printf 的工作方式:

  1. 定義一個包含占位符的模板字符串。

  2. 在字符串后面,按順序提供與占位符對應的變量。

  3. 函數會自動將變量替換到相應的位置,并輸出到控制臺。

示例:

image.png

這段代碼不僅更易讀、更易維護,而且 Go 會自動處理類型,我們無需再關心 intstring 的轉換。注意 Printf 不會自動換行,因此我們在模板末尾手動添加了 \n

3、生成格式化字符串:fmt.Sprintf

有時我們需要的不是直接打印到控制臺,而是將格式化后的結果保存為一個字符串變量。這時可以使用 fmt.Sprintf

它的用法與 Printf 完全相同,唯一的區別是它會返回一個格式化好的字符串,而不是將其打印出來。

image.png

這個函數在構建日志信息、生成 API 響應或任何需要先處理再輸出的場景中非常有用。

4、性能說明

通常情況下,fmt.Printffmt.Sprintf 是構建字符串的首選方法,因為它們極大地提升了代碼的可讀性和可維護性。但在對性能有極端要求的場景中,手動的字符串拼接(如使用 strings.Builder)可能會有更好的性能表現。對于絕大多數應用,可讀性帶來的好處遠超微小的性能差異。

5、常用格式化占位符

Go 提供了豐富的占位符來控制輸出格式。以下是一些最常用的占位符:

| 占位符 | 描述 | 常用類型 |

| ---------- | -------------------------------- | --------------- |

| 通用 | | |

| %v | 默認格式的值。對于不同類型,會以最合適的方式展示。 | 任何類型 |

| %+v | 在 %v 的基礎上,打印結構體時會額外輸出字段名。 | struct |

| %#v | Go 語法表示的值。輸出結果是符合 Go 語法的字面量。 | 任何類型 |

| %T | 值的類型。輸出變量的類型信息。 | 任何類型 |

| 字符串 | | string |

| %s | 普通的字符串或 []byte | string |

| %q | 為字符串加上雙引號,并對特殊字符進行安全轉義。 | string |

| 整數 | | int, uint 等 |

| %d | 十進制表示 | int |

| %b | 二進制表示 | int |

| %o | 八進制表示 | int |

| %x, %X | 十六進制表示 (分別為小寫 a-f 和大寫 A-F) | int |

| 浮點數 | | float |

| %f | 標準小數表示 (例如 123.456) | float |

| %e, %E | 科學計數法表示 (例如 1.23456e+02) | float |

| 布爾值 | | bool |

| %t | truefalse | bool |

| 指針 | | 指針類型 |

| %p | 指針的十六進制表示(以 0x 開頭) | 指針 |

寬度與對齊示例:

你還可以控制輸出的寬度和對齊方式。

image.png

掌握格式化輸出是 Go 語言開發者的必備技能。fmt.Printffmt.Sprintf 提供了一種強大而靈活的方式來構建和展示字符串,使得代碼更加簡潔和專業。在日常開發中,應優先選擇這些函數來處理字符串格式化任務。

4、高性能字符串拼接

當需要拼接大量字符串,尤其是在循環中,性能就成為一個重要的考量因素。此時,strings.Builder 是最佳選擇。它的性能遠高于 + 拼接和 fmt.Sprintf

strings.Builder 通過維護一個內部的字節緩沖區(buffer)來避免每次拼接都重新分配內存,從而實現高效的字符串構建。

使用步驟:

  1. 創建一個 strings.Builder 實例。

  2. 使用 WriteString()Write() 等方法向其內部緩沖區追加內容。

  3. 最后調用 String() 方法獲取最終拼接完成的字符串。

image.png

雖然 strings.Builder 的代碼看起來比 Sprintf 繁瑣一些,但在性能敏感的場景下,它是構建字符串的不二之選。

如何選擇拼接方式

掌握不同場景下最合適的字符串拼接方法,是編寫高效、可維護 Go 代碼的關鍵。

  • + 拼接:僅適用于少量、簡單的字符串連接。

  • fmt.Sprintf日常開發首選。代碼可讀性最高,使用最方便,足以應對絕大多數場景。

  • strings.Builder性能要求高的場景首選。當程序中有大量或頻繁的字符串拼接操作(例如在循環內部)時,應優先使用 Builder 以獲得最佳性能。

5、字符串的比較

在 Go 中,比較字符串是一項直接且常用的操作。

1、等于 (==) 和不等于 (!=)

你可以使用標準的比較運算符 ==!= 來判斷兩個字符串是否完全相同。

image.png

2、大于 (>) 和小于 (<)

Go 語言同樣支持使用 ><>=<= 來比較字符串的大小。

比較規則: 字符串的比較是按字典順序進行的。它會從左到右逐個比較兩個字符串中對應位置字符的 ASCII 碼值(或更準確地說是 Unicode 碼點)。一旦發現差異,比較立即結束并返回結果。

image.png

6、字符串操作常用方法

Go 的標準庫 strings 提供了大量實用、高效的字符串處理函數。要使用它們,首先需要導入該包:


import ("strings")

下面我們介紹一些最常用的函數。

1、包含與計數

  • strings.Contains(s, substr): 判斷字符串 s 中是否包含子串 substr

  • strings.Count(s, substr): 計算子串 substr 在字符串 s 中出現的次數。

image.png

2、分割與連接

  • strings.Split(s, sep): 使用分隔符 sep 將字符串 s 分割成一個字符串切片。

image.png

如果分隔符不存在,Split 會返回一個只包含原字符串的切片。

3、前綴與后綴

  • strings.HasPrefix(s, prefix): 判斷字符串 s 是否以 prefix 開頭。

  • strings.HasSuffix(s, suffix): 判斷字符串 s 是否以 suffix 結尾。

image.png

4、查找位置

  • strings.Index(s, substr): 查找子串 substr 在字符串 s 中首次出現的位置(字節索引)。如果不存在,則返回 -1。

image.png

注意Index 返回的是字節位置。對于包含多字節字符(如中文)的字符串,這個位置可能不等于字符的個數。

5、替換

  • strings.Replace(s, old, new, n): 將字符串 s 中的 old 子串替換為 new。參數 n 控制替換次數:

  • n < 0 (通常用 -1): 全部替換。

  • n > 0: 最多替換 n 次。

image.png

6、大小寫轉換

  • strings.ToLower(s): 將字符串轉換為全小寫。

  • strings.ToUpper(s): 將字符串轉換為全大寫。

image.png

image.png

7、修剪字符

  • strings.Trim(s, cutset): 從字符串 s 的兩端移除 cutset 中包含的任意字符。

  • strings.TrimSpace(s): 移除字符串兩端的空白字符(空格、制表符、換行符等),這是最常用的修剪函數。

  • strings.TrimLeft(s, cutset)strings.TrimRight(s, cutset): 分別只從左邊或右邊修剪。

image.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85144.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85144.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85144.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數學建模會議筆記

看似優化模型 建立整數規劃模型 用優化軟件、啟發式方法、精確方法求解 建立圖論和組合優化模型用組合優化方法、啟發式方法求解 建立博弈論模型 數據統計分析與可視化- 數據擬合、參數估計、插值、數據的標準化、去偽補全相關度分析、分類、聚類等 最優化理論和方法 線性規劃…

學習昇騰開發的六天--ACL應用開發之運行第一個實例

1、下載一個實例&#xff0c;運行一個圖像分類實例&#xff08;環境&#xff1a;Ubuntu22.04&#xff0c;硬件&#xff1a;昇騰310B1&#xff0c;加速模塊&#xff1a;atlas 200i a2&#xff09; samples: CANN Samples - Gitee.com 目錄結構如下&#xff1a; ├── data │…

可靈AI-快手公司自主研發的一款AI視頻與圖像生成工具

可靈AI是由快手公司自主研發的一款AI視頻與圖像生成工具&#xff0c;于2024年6月正式推出。以下是對其的詳細介紹&#xff1a; 核心功能 AI視頻生成&#xff1a; 文生視頻&#xff1a;輸入文字描述&#xff0c;AI可自動生成匹配的視頻片段。圖生視頻&#xff1a;上傳圖片&…

創客匠人解析:存量時代創始人 IP 打造與免費流量池策略

在存量競爭的商業環境中&#xff0c;企業如何突破增長瓶頸&#xff1f;創客匠人結合新潮傳媒創始人張繼學的實戰洞察&#xff0c;揭示 “品牌 IP” 雙輪驅動下的免費流量池構建邏輯&#xff0c;為知識變現與創始人 IP 打造提供新思路。 一、存量時代的流量革命&#xff1a;從…

提升語義搜索效率:LangChain 與 Milvus 的混合搜索實戰

我從不幻想人生能夠毫無波折&#xff0c;但我期望遭遇困境之際&#xff0c;自身能夠成為它的克星。 概述 LangChain與Milvus的結合構建了一套高效的語義搜索系統。LangChain負責處理多模態數據&#xff08;如文本、PDF等&#xff09;的嵌入生成與任務編排&#xff0c;Milvus作…

MySQL配置簡單優化與讀寫測試

測試方法 先使用sysbench對默認配置的MySQL單節點進行壓測&#xff0c;單表數據量為100萬&#xff0c;數據庫總數據量為2000萬&#xff0c;每次壓測300秒。 sysbench --db-drivermysql --time300 --threads10 --report-interval1 \--mysql-host192.168.0.10 --mysql-port3306…

獵板深耕透明 PCB,解鎖電子設計新邊界

在電子技術快速迭代的當下&#xff0c;獵板始終關注行業前沿&#xff0c;透明 PCB 作為極具創新性的技術&#xff0c;正在改變電子設備的設計與應用格局。? 從傳統的綠色、棕色 PCB 到如今的透明 PCB&#xff0c;其突破在于特殊基材與導電材料的運用&#xff0c;實現 85%-92%…

FLAML:快速輕量級自動機器學習框架

概述 FLAML&#xff08;Fast and Lightweight AutoML&#xff09;是微軟開發的一個高效的自動機器學習&#xff08;AutoML&#xff09;框架。它專注于在有限的計算資源和時間約束下&#xff0c;自動化機器學習管道的構建過程&#xff0c;包括特征工程、模型選擇、超參數調優等…

Github 以及 Docker的 wsl --list --online無法訪問問題

修改電腦DNS 騰訊 DNS IP&#xff1a;119.29.29.29 備用&#xff1a;182.254.116.116 阿里DNS IP&#xff1a;223.5.5.5 223.6.6.6 百度DNS IP:180.76.76.76 谷歌DNS IP:8.8.8.8

Go 語言中的變量和常量

這篇文章已經放到騰訊智能工作臺的知識庫啦&#xff0c;鏈接在這里&#xff1a;ima.copilot-Go 入門到入土。要是你有啥不懂的地方&#xff0c;就去知識庫找 AI 聊一聊吧。 1、變量的聲明與使用 我們來探討編程語言中最核心的概念之一&#xff1a;變量。 1、靜態語言中的變量…

破局傳統訂貨!云徙渠道訂貨系統賦能企業數字化渠道升級

在數字化浪潮的推動下&#xff0c;傳統經銷商訂貨模式面臨著諸多挑戰&#xff0c;如信息孤島、系統崩潰、移動化不足等問題。云徙渠道訂貨系統憑借其創新的數字化架構和強大的功能模塊&#xff0c;正在成為企業實現渠道數字化轉型的重要工具。 系統功能與創新 云徙渠道訂貨系統…

SQL關鍵字三分鐘入門:UNION 與 UNION ALL —— 數據合并全攻略

在處理數據時&#xff0c;有時我們需要將來自不同表或同一表的不同查詢結果合并在一起。例如&#xff1a; 合并兩個部門的員工名單&#xff1b;將多個地區的銷售數據匯總&#xff1b;顯示某段時間內所有新增和修改的記錄。 這時候&#xff0c;我們就需要用到 SQL 中非常強大的…

SNMPv3 的安全命名空間詳解

1. 安全命名空間的本質 安全命名空間是 SNMPv3 的核心安全機制&#xff0c;通過 上下文&#xff08;Context&#xff09; 實現&#xff1a; #mermaid-svg-6cV9146nTFF1zCMJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#merma…

【嵌入式硬件實例】-555定時器實現煙霧和易燃氣體泄露檢測

555定時器實現煙霧和易燃氣體泄露檢測 文章目錄 555定時器實現煙霧和易燃氣體泄露檢測1、555定時器介紹2、MQ-2 氣體/煙霧傳感器模塊介紹3、硬件準備與接線在本文中,我們將使用555定時器和MQ-2氣體傳感器構建一個氣體泄漏檢測和報警系統。它在煤氣泄漏期間用作家庭安全警報器。…

【機器人】DualMap 具身導航 | 動態場景 開放詞匯語義建圖 導航系統

DualMap 是一個在線的開放詞匯語義映射系統&#xff0c;使得機器人能夠通過自然語言查詢在動態變化的環境中理解和導航 雙地圖導航&#xff0c;結合全局抽象地圖進行高層次候選選擇&#xff0c;以及局部具體地圖進行精確目標定位&#xff0c;有效管理和更新環境中的動態變化。…

【Fifty Project - D37】

fifty project算是失敗了一半了 成功的那一半在于一定程度上拯救了我的作息和健康&#xff0c;兩個月前入職體檢的肝有點不健康&#xff0c;昨天復查發現全都回到了健康范圍&#xff01;尿酸也在正常范圍&#xff01;就是體重還是沒減下來hhh 失敗的一半在于自己很差勁的規劃能…

解碼危險品物流背后的“隱形防線”

當急救藥品跨越千里送達醫院&#xff0c;當新能源電池準時抵達生產線&#xff0c;當化工原料安全運往工廠……這些與日常生活息息相關的場景背后&#xff0c;有一群人始終在和時間賽跑&#xff0c;與風險博弈。他們不是超級英雄&#xff0c;而是危險品物流從業者——一個鮮少被…

Flutter Melos在外包團隊協作中的弊端與應對策略

引言 在大型Flutter項目開發中&#xff0c;Melos作為一款優秀的Monorepo管理工具&#xff0c;能夠有效協調多包項目的開發流程。然而&#xff0c;當項目涉及外包團隊協作時&#xff0c;Melos的使用會面臨一系列獨特的挑戰。本文將深入分析Flutter Melos在外包團隊協作環境中的…

<selectKey> 中的order 屬性

在 MyBatis 中&#xff0c;<selectKey> 標簽的 order 屬性用于指定生成主鍵值的 SQL 語句執行時機。 除了 AFTER&#xff0c;MyBatis 還支持另一種模式&#xff1a;BEFORE&#xff0c; 它們有明確的使用場景和區別&#xff1a; order"AFTER" 適用數據庫&#x…

BitsAndBytes(簡稱 BnB)是一個用于“壓縮”大語言模型的工具包

BitsAndBytes&#xff08;簡稱 BnB&#xff09;是一個用于“壓縮”大語言模型的工具包&#xff0c;能把模型從原來的16位或32位&#xff0c;壓成4位或8位&#xff0c;減少顯存占用&#xff0c;同時保持盡量高的精度。 &#x1f9e9; 為什么叫 Bits and Bytes&#xff1f; 它的…