Go字符串實戰操作大全!

目錄

    • 1. 引言
      • 文章結構概覽
    • 2. Go字符串基礎
      • 字符串的定義與特性
        • 什么是字符串?
        • Go字符串的不可變性原則
      • 字符串的數據結構
        • Go字符串的內部表達
        • `byte`和`rune`的簡介
    • 3. 字符串操作與應用
      • 3.1 操作與應用
        • 字符串連接
        • 字符串切片
        • 字符串查找
        • 字符串比較
        • 字符串的替換
        • 字符串的大小寫轉換
        • 使用正則表達式處理字符串
        • 字符串的加密與哈希
        • 字符串拆分
        • 字符串合并
        • 獲取字符串中的字符
        • 字符串中字符的遍歷
        • 修剪字符串
        • 填充字符串
        • 字符串的統計
      • 3.2 使用標準庫處理字符串
        • `strings`庫概覽
        • 其他有用的字符串庫
    • 4. Go字符串字符編碼
      • 什么是字符編碼?
      • UTF-8 編碼簡介
      • Unicode碼點與rune類型
      • 字符串與UTF-8互操作
        • 獲取字符串長度
        • 將字符串解碼為rune切片
      • 轉換字符編碼
    • 5. Go字符串類型轉換
      • 字符串與整數
        • 整數轉字符串
        • 字符串轉整數
      • 字符串與浮點數
        • 浮點數轉字符串
        • 字符串轉浮點數
      • 字符串與字節切片
        • 字符串轉字節切片
        • 字節切片轉字符串
    • 6. 總結

在本篇文章中,我們深入探討了Go語言中字符串的魅力和深度。從基礎定義、操作、字符編碼到復雜的類型轉換,每個環節都帶有實例和代碼示例來深化理解。通過這些深入的解析,讀者不僅能夠掌握字符串在Go中的核心概念,還能洞察Go設計哲學背后的思考。

關注【TechLead】,分享互聯網架構、云服務技術的全維度知識。作者擁有10+年互聯網服務架構、AI產品研發經驗、團隊管理經驗,同濟本復旦碩,復旦機器人智能實驗室成員,阿里云認證的資深架構師,項目管理專業人士,上億營收AI產品研發負責人。

file

1. 引言

在現代編程中,字符串處理是不可或缺的一部分。無論是簡單的用戶界面,還是復雜的數據處理,字符串都扮演著關鍵的角色。Go語言,作為一個現代的、性能優越的編程語言,為字符串處理提供了一系列強大的工具和功能。

文章結構概覽

為了幫助讀者深入理解Go中的字符串,我們將在文章中討論以下幾個主題:

  • Go字符串的基本定義和特性。
  • 如何在Go中進行常見的字符串操作。
  • 字符編碼,尤其是UTF-8在Go中的應用。
  • 如何進行字符串的各種類型轉換。

通過本文的深入解析,您能對Go字符串有一個全面而深入的了解,并能在實際應用中得心應手。


2. Go字符串基礎

file

字符串在編程領域中是至關重要的,無論您是在處理用戶輸入,還是從數據庫中讀取數據,都離不開字符串。Go語言為字符串處理提供了簡潔且高效的工具。

字符串的定義與特性

什么是字符串?

定義: 在Go中,字符串是任意字節的集合,通常用于表示文本。字符串是不可變的,這意味著您不能修改字符串的某個字符,但可以生成一個新的字符串。

例子:

// 定義一個字符串
greeting := "Hello, Go!"
fmt.Println(greeting)  // 輸出: Hello, Go!
Go字符串的不可變性原則

定義: 在Go中創建的每一個字符串都是不可變的。這意味著您不能直接修改字符串中的字符。這種設計可以為字符串操作帶來一些性能優勢,尤其是在字符串復制和傳遞時。

例子:

str := "GoLang"
// str[0] = 'g'  // 這會報錯
newStr := "g" + str[1:]
fmt.Println(newStr)  // 輸出: golang, 通過創建新的字符串來"修改"原字符串

字符串的數據結構

Go字符串的內部表達

定義: Go字符串背后是一個字節數組,這也意味著Go能夠存儲任何數據,不僅僅是UTF-8文本。

例子:

// 字符串和其對應的字節
str := "Hello"
for i := 0; i < len(str); i++ {fmt.Printf("%x ", str[i])  // 輸出每個字符的十六進制表示
}
// 輸出: 48 65 6c 6c 6f
byterune的簡介

定義:

  • byteuint8的別名,通常用于處理ASCII字符。
  • runeint32的別名,用于處理一個UTF-8字符或Unicode碼點。

例子:

// byte和ASCII字符
byteValue := byte('A')
fmt.Println(byteValue)  // 輸出: 65// rune和UTF-8字符
runeValue := rune('你')
fmt.Printf("%#U \n", runeValue)  // 輸出: U+4F60

3. 字符串操作與應用

處理字符串是日常編程任務的一部分,Go語言提供了一整套工具和標準庫函數,使這些操作變得簡單和高效。

3.1 操作與應用

字符串連接

定義: 在Go中,可以使用+運算符將兩個或多個字符串連接起來。

例子:

// 字符串連接
str1 := "Hello"
str2 := "World"
result := str1 + ", " + str2
fmt.Println(result)  // 輸出: Hello, World
字符串切片

定義: 由于Go字符串背后是字節切片,所以您可以像處理數組或切片那樣處理字符串,獲取字符串的子串。

例子:

// 字符串切片
str := "GoLang"
subStr := str[2:4]
fmt.Println(subStr)  // 輸出: La
字符串查找

定義: 使用strings包中的函數,如ContainsIndex等,可以輕松查找子串或字符。

例子:

import "strings"str := "Hello, Go!"
found := strings.Contains(str, "Go")
fmt.Println(found)  // 輸出: trueposition := strings.Index(str, "Go")
fmt.Println(position)  // 輸出: 7
字符串比較

定義: Go提供了一種原生的方式來比較兩個字符串是否相等。此外,strings庫中的Compare函數可以用來確定兩個字符串在字典序上的先后關系。

例子:

str1 := "apple"
str2 := "banana"// 使用==比較字符串
isEqual := str1 == str2
fmt.Println(isEqual)  // 輸出: false// 使用strings.Compare比較字符串
compResult := strings.Compare(str1, str2)
fmt.Println(compResult)  // 輸出: -1, 表示str1在str2之前
字符串的替換

定義: 使用strings包中的ReplaceReplaceAll函數,您可以在字符串中替換子串。

例子:

source := "go is good, go is great"
replaced := strings.ReplaceAll(source, "go", "Go")
fmt.Println(replaced)  // 輸出: Go is good, Go is great
字符串的大小寫轉換

定義: strings庫為大小寫轉換提供了ToUpperToLower函數。

例子:

str := "GoLang"
lowercase := strings.ToLower(str)
uppercase := strings.ToUpper(str)
fmt.Println(lowercase)  // 輸出: golang
fmt.Println(uppercase)  // 輸出: GOLANG
使用正則表達式處理字符串

定義: Go的regexp庫提供了一系列函數來使用正則表達式進行字符串的查詢、匹配、替換和切分。

例子:

import "regexp"str := "My email is example@example.com"
re := regexp.MustCompile(`[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}`)
email := re.FindString(str)
fmt.Println(email)  // 輸出: example@example.com
字符串的加密與哈希

定義: Go的crypto包提供了多種加密算法,您可以使用它們來加密字符串或計算字符串的哈希。

例子:

import ("crypto/md5""fmt""io"
)str := "secret data"
hasher := md5.New()
io.WriteString(hasher, str)
fmt.Printf("%x\n", hasher.Sum(nil))  // 輸出: md5哈希值
字符串拆分

定義: 使用strings.Split函數,可以按指定的分隔符將字符串拆分為子串的切片。

例子:

str := "apple,banana,cherry"
items := strings.Split(str, ",")
fmt.Println(items)  // 輸出: [apple banana cherry]
字符串合并

定義: strings.Join函數能夠將一個字符串切片合并為一個單獨的字符串。

例子:

items := []string{"apple", "banana", "cherry"}
str := strings.Join(items, ", ")
fmt.Println(str)  // 輸出: apple, banana, cherry
獲取字符串中的字符

定義: 可以通過索引訪問字符串中的每個字符,但返回的是字符的byte值。

例子:

str := "Go"
byteValue := str[1]
fmt.Println(byteValue)  // 輸出: 111 (ASCII碼的'o')
字符串中字符的遍歷

定義: 使用for range循環可以迭代字符串中的每個字符。

例子:

str := "Go"
for index, char := range str {fmt.Printf("At index %d, char: %c\n", index, char)
}
修剪字符串

定義: strings.TrimSpace函數可以去除字符串首尾的空格。

例子:

str := "   Go Lang   "
trimmed := strings.TrimSpace(str)
fmt.Println(trimmed)  // 輸出: Go Lang
填充字符串

定義: 使用fmt包,您可以使用特定的格式修飾符來填充或對齊字符串。

例子:

str := "Go"
padded := fmt.Sprintf("%-10s", str)
fmt.Println(padded)  // 輸出: Go        
字符串的統計

定義: strings.Count函數可以幫助統計一個子串在字符串中出現的次數。

例子:

str := "Go is easy to learn. Go is powerful."
count := strings.Count(str, "Go")
fmt.Println(count)  // 輸出: 2

3.2 使用標準庫處理字符串

strings庫概覽

定義: strings庫提供了一系列強大的函數,用于字符串的查詢、替換、轉換和切分等操作。

例子:

import "strings"str := "go is awesome"
title := strings.Title(str)
fmt.Println(title)  // 輸出: Go Is Awesome
其他有用的字符串庫
  • strconv庫:用于字符串與其他基本數據類型之間的轉換。

    例子:

    import "strconv"number := 12345
    strNum := strconv.Itoa(number)
    fmt.Println(strNum)  // 輸出: "12345"
    
  • unicode庫:用于檢查字符屬性,如是否為數字、字母等。

    例子:

    import "unicode"ch := 'A'
    isLetter := unicode.IsLetter(ch)
    fmt.Println(isLetter)  // 輸出: true
    

4. Go字符串字符編碼

字符串在計算機中是通過字符編碼來存儲和表示的。在Go中,字符串默認使用UTF-8編碼,這意味著它可以輕松表示任何Unicode字符。

什么是字符編碼?

定義: 字符編碼是一套規則,用于將字符轉換為計算機可以理解的數字代碼。常見的字符編碼包括ASCII、ISO-8859-1和UTF-8。

UTF-8 編碼簡介

定義: UTF-8是一種變長的Unicode字符編碼方法,使用1到4個字節來表示一個字符。它是Unicode標準的官方推薦編碼。

例子:

str := "Go"
for i := 0; i < len(str); i++ {fmt.Printf("%x ", str[i])
}
// 輸出: 47 6f 

Unicode碼點與rune類型

定義: Unicode碼點是每個字符的唯一數字表示。在Go中,可以使用rune類型來存儲和處理Unicode碼點。

例子:

str := "語言"
for _, char := range str {fmt.Printf("U+%04X ", char)
}
// 輸出: U+8BED U+8A00

字符串與UTF-8互操作

獲取字符串長度

定義: 使用len函數可以獲取字符串的字節長度,但在UTF-8編碼下,要獲取字符數量需要使用utf8.RuneCountInString

例子:

str := "語言"
byteLen := len(str)
runeLen := utf8.RuneCountInString(str)
fmt.Println(byteLen)  // 輸出: 6
fmt.Println(runeLen)  // 輸出: 2
將字符串解碼為rune切片

定義: 使用[]rune可以將字符串轉換為rune切片。

例子:

str := "語言"
runes := []rune(str)
fmt.Println(runes)  // 輸出: [35821 35328]

轉換字符編碼

盡管Go主要支持UTF-8,但有時可能需要與其他字符編碼互操作,如ISO-8859-1或GBK。這時可以使用第三方庫,例如golang.org/x/text/encoding

例子:

// 請首先安裝 golang.org/x/text/encoding
import "golang.org/x/text/encoding/simplifiedchinese"
import "golang.org/x/text/transform"str := "語言"
encoder := simplifiedchinese.GB18030.NewEncoder()
encoded, _, _ := transform.String(encoder, str)
fmt.Println(encoded)  // 輸出: GBK編碼的字符串

5. Go字符串類型轉換

在Go中,與字符串相關的類型轉換非常常見。這涉及到將其他基本數據類型(如整數、浮點數)轉換為字符串,或反之。以下部分探討了這些常見的轉換方法。

字符串與整數

整數轉字符串

定義: 使用strconv.Itoa函數可以將整數轉換為字符串。

例子:

num := 123
str := strconv.Itoa(num)
fmt.Println(str)  // 輸出: "123"
字符串轉整數

定義: strconv.Atoi函數可以將字符串轉換為整數。

例子:

str := "456"
num, err := strconv.Atoi(str)
if err != nil {fmt.Println(err)
} else {fmt.Println(num)  // 輸出: 456
}

字符串與浮點數

浮點數轉字符串

定義: 使用strconv.FormatFloat函數,可以將浮點數轉換為字符串。

例子:

f := 3.14
str := strconv.FormatFloat(f, 'f', 2, 64)
fmt.Println(str)  // 輸出: "3.14"
字符串轉浮點數

定義: strconv.ParseFloat函數可以將字符串轉換為浮點數。

例子:

str := "5.67"
f, err := strconv.ParseFloat(str, 64)
if err != nil {fmt.Println(err)
} else {fmt.Println(f)  // 輸出: 5.67
}

字符串與字節切片

字符串轉字節切片

定義: 使用類型轉換可以將字符串轉換為字節切片。

例子:

str := "Go"
bytes := []byte(str)
fmt.Println(bytes)  // 輸出: [71 111]
字節切片轉字符串

定義: 使用類型轉換,可以將字節切片轉換為字符串。

例子:

bytes := []byte{72, 101, 108, 108, 111}
str := string(bytes)
fmt.Println(str)  // 輸出: "Hello"

6. 總結

字符串在編程中是一個基本且不可或缺的數據類型。通過這篇文章,我們深入了解了Go語言中字符串的內部工作機制、操作、字符編碼,以及如何進行各種類型的轉換。這些知識點不僅展現了Go對字符串操作的強大功能,還揭示了它是如何優雅地處理多語言文本的。

從Go的設計哲學中,我們可以看到它如何平衡性能、安全性和易用性。字符串是只讀的,這使得它在并發情況下是安全的。同時,Go使用UTF-8作為其默認編碼,使得全球化的應用程序開發變得簡單而直觀。


關注【TechLead】,分享互聯網架構、云服務技術的全維度知識。作者擁有10+年互聯網服務架構、AI產品研發經驗、團隊管理經驗,同濟本復旦碩,復旦機器人智能實驗室成員,阿里云認證的資深架構師,項目管理專業人士,上億營收AI產品研發負責人。

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

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

相關文章

vos3000外呼系統警告消除怎么設置

你有沒有發現vos3000登陸時老是提示告警&#xff0c;消除一會又出現&#xff0c;那么又什么辦法能解決呢&#xff1f;要徹底消除 VOS3000 系統的警告&#xff0c;一般需要通過以下步驟來進行排查和解決&#xff1a; 確認警告信息&#xff1a;首先要明確警告的具體內容和出現的條…

舊的Spring Security OAuth已停止維護,全面擁抱最新解決方案Spring SAS

Spring Authorization Server 替換 Shiro 指引 背景 Spring 團隊正式宣布 Spring Security OAuth 停止維護&#xff0c;該項目將不會再進行任何的迭代 目前 Spring 生態中的 OAuth2 授權服務器是 Spring Authorization Server 已經可以正式生產使用作為 SpringBoot 3.0 的最新…

c++異常機制(3) -- 異常類型和生命周期

目錄 拋出的異常類型大致可以分為三種。 第一種 基本類型 1. 可以直接拋出常量 2. 也可以拋出定義好的變量 3. 如果我們使用const&#xff0c;會不會影響到異常的匹配。 第二種 字符串類型以及指針類型 1. 使用字符指針 注意: 2. 使用string類型 第三種 …

計算機專業大學生的簡歷,為何會出現在垃圾桶

為什么校招過后垃圾桶里全是簡歷&#xff0c;計算機專業的學生找工作有多難&#xff1f; 空哥這么跟你說吧&#xff0c;趁現在還來得及&#xff0c;這些事情你一定要聽好了。 第一&#xff0c;計算機專業在學校學的東西是非常有限的&#xff0c;985211的還好&#xff0c;如果…

GPS歷史軌跡優化算法的研究與實現

GPS歷史軌跡優化算法的研究與實現 摘要 本研究提出了一種綜合利用數據清洗、密度聚類、卡爾曼濾波和地圖匹配的新算法,命名為“DSKF-Match”。該算法旨在處理GPS軌跡數據,通過清洗、聚類、平滑和匹配等步驟,提高數據的質量和準確性。首先,算法利用時間窗口法進行數據清洗…

D365:LookUp

文章目錄 前言一、復制onLookUp事件方法二、LookUp方法 前言 在Form的字段的onLookUp方法中&#xff0c;添加下拉框。 一、復制onLookUp事件方法 二、LookUp方法 [FormControlEventHandler(formControlStr(EcoResProductDetailsExtended, VyaKeyItemType_VyaMaterialSubCode…

Vue2:路由守衛實現權限管理之獨享路由守衛

一、情景說明 單獨給某個路由組件配置守衛 二、案例 給news路由配置獨享路由守衛 在進入該路由組件前&#xff0c;會觸發相關函數 函數內編寫鑒權功能的相關代碼即可 關鍵配置&#xff1a;beforeEnter {name:xinwen,path:news,component:News,meta:{isAuth:true,title:新聞}…

【PyTorch知識點匯總】

PyTorch是一個廣泛使用的深度學習框架&#xff0c;它提供了許多功能強大的工具和函數&#xff0c;用于構建和訓練神經網絡。以下是一些PyTorch的常用知識點和示例說明&#xff1a; 張量&#xff08;Tensors&#xff09; 創建張量&#xff1a;使用torch.tensor()?、torch.Tenso…

面試經典150題——用最少數量的箭引爆氣球

"The only person you are destined to become is the person you decide to be." - Ralph Waldo Emerson 1. 題目描述 2. 題目分析與解析 這個題目開始讀題的時候是有點不好理解題意的&#xff0c;因此我先做個圖讓大家對于題意有更好更直觀的理解再來分析題目。 …

如何使用Portainer創建Nginx容器并搭建web網站發布至公網可訪問【內網穿透】

文章目錄 前言1. 安裝Portainer1.1 訪問Portainer Web界面 2. 使用Portainer創建Nginx容器3. 將Web靜態站點實現公網訪問4. 配置Web站點公網訪問地址4.1公網訪問Web站點 5. 固定Web靜態站點公網地址6. 固定公網地址訪問Web靜態站點 前言 Portainer是一個開源的Docker輕量級可視…

SQL 常見命令及規范

常見命令 1. 查看當前所有數據庫 show databases; 2. 打開指定的庫 use 庫名 ; 3. 查看當前庫的所有表 show tables; 4. 查看其他庫的所有表 show tables from 庫名 ; 5. 創建表 cerate table 表名 ( 列名 列類型&#xff0c; 列名 列類型&#xff0c; ..... …

基于YOLO家族最新模型YOLOv9開發構建自己的個性化目標檢測系統從零構建模型完整訓練、推理計算超詳細教程【以自建數據酸棗病蟲害檢測為例】

在我前面的系列博文中,對于目標檢測系列的任務寫了很多超詳細的教程,目的是能夠讀完文章即可實現自己完整地去開發構建自己的目標檢測系統,感興趣的話可以自行移步閱讀: 《基于官方YOLOv4-u5【yolov5風格實現】開發構建目標檢測模型超詳細實戰教程【以自建缺陷檢測數據集為…

C# OpenVINO Crack Seg 裂縫分割 裂縫檢測

目錄 效果 模型信息 項目 代碼 數據集 下載 C# OpenVINO Crack Seg 裂縫分割 裂縫檢測 效果 模型信息 Model Properties ------------------------- date&#xff1a;2024-02-29T16:35:48.364242 author&#xff1a;Ultralytics task&#xff1a;segment version&…

去掉WordPress網頁圖片默認鏈接功能

既然是wordpress自動添加的&#xff0c;那么我們在上傳圖片到wordpress后臺多媒體的時候&#xff0c;就可以手動改變鏈接指向或者刪除掉&#xff0c;問題是每次都要這么做很麻煩&#xff0c;更別說有忘記的時候。一次性解決這個問題有兩種方法&#xff0c;一種是No Image Link插…

【生成式AI】ChatGPT原理解析(1/3)- 對ChatGPT的常見誤解

Hung-yi Lee 課件整理 文章目錄 誤解1誤解2ChatGPT真正在做的事情-文字接龍 ChatGPT是在2022年12月7日上線的。 當時試用的感覺十分震撼。 誤解1 我們想讓chatGPT講個笑話&#xff0c;可能會以為它是在一個笑話的集合里面隨機地找一個笑話出來。 我們做一個測試就知道不是這樣…

C# Post數據或文件到指定的服務器進行接收

目錄 應用場景 實現原理 實現代碼 PostAnyWhere類 ashx文件部署 小結 應用場景 不同的接口服務器處理不同的應用&#xff0c;我們會在實際應用中將A服務器的數據提交給B服務器進行數據接收并處理業務。 比如我們想要處理一個OFFICE文件&#xff0c;由用戶上傳到A服務器…

中國汽車電子行業發展現狀分析及投資前景預測報告

全版價格&#xff1a;壹捌零零 報告版本&#xff1a;下單后會更新至最新版本 交貨時間&#xff1a;1-2天 第一章 汽車電子相關概述 1.1 汽車的相關介紹 1.1.1 汽車的概念 我國國家最新標準《汽車和掛車類型的術語和定義》&#xff08;GB/T3730&#xff0e;1—2001&…

基于springboot+vue的貿易行業crm系統

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

Flink分區相關

0、要點 Flink的分區列不會存數據&#xff0c;也就是兩個列有一個分區列&#xff0c;則文件只會存另一個列的數據 1、CreateTable 根據SQL的執行流程&#xff0c;進入TableEnvironmentImpl.executeInternal&#xff0c;createTable分支 } else if (operation instanceof Crea…

Java-nio

一、NIO三大組件 NIO的三大組件分別是Channel&#xff0c;Buffer與Selector Java NIO系統的核心在于&#xff1a;通道(Channel)和緩沖區(Buffer)。通道表示打開到 IO 設備(例如&#xff1a;文件、套接字)的連接。若需要使用 NIO 系統&#xff0c;需要獲取用于連接 IO 設備的通…