網站首頁 編程語言 正文
字符串簡介
字符串是一段固定長度字符連接起來的字符序列,GO語言中的字符串是由單個字節連起來的,其字符串字節是由 UTF-8 編碼來表示unicode 文本的。
由于該編碼占用字節長度的不確定性,所以在GO語言中,字符串會根據需要占用 1~4 個字節,這于其他編程語言不同(比如 c++ python java)比如說Java字符串始終占用2個字節。GO這樣做不僅減少了內存和硬盤的占用,也不需要其他語言那樣對 UTF-8 進行編解碼。
GO中字符串和Java中字符串一樣,其值是不可變的(創建之后要修改,只會將指針指向新的字符串),當代碼中存在字符串,編譯器會將其標記成只讀數據 SRODATA
常用方法
中文字符串截取
在GO中我們可以直接通過切片來截取字符串,但是當截取的字符串是中文的時候就要注意了,在GO中,英文是占用一個字節的,中文占用的的是3個字節,當我們直接用切片截取的時候,可能會將中文的編碼截成兩半,結果就是最后那個字是一個亂碼。
這里比較推薦使用 rune 數組來截取字符串,截取后再轉為字符串。通過 rune 截取的不是字節了,該數組每一條都存儲這一個字(英文字母,中文漢字)
示例如下:示例
package main import ( ?? ?"fmt" ?? ?"unicode/utf8" ) func main() { ?? ?// 聲明一個字符串 ?? ?str := "這是一串字符串,測試 go 的方法" ?? ?// 字符串長度 ?? ?fmt.Println(utf8.RuneCountInString(str)) ?? ?// 字節長度 ?? ?fmt.Println(len(str)) ?? ?// 這個截取是按字節來截取的 ?? ?str1 := str[0:9] ?? ?fmt.Println(str1) ?? ?// 一個中文占用3個字節,當截取10個字節時候,最后一個漢字就會發生亂碼 ?? ?str2 := str[0:10] ?? ?fmt.Println(str2) ?? ?// 將字符串轉為 rune 數組,然后截取再轉回字符串 ?? ?strRune := []rune(str) ?? ?fmt.Println(len(strRune)) ?? ?// 注意了這里不是字節了,而是4個字 ?? ?fmt.Println(string(strRune[0:4])) } //輸出 //17 //43 //這是一 //這是一? //17 //這是一串
反轉字符串
這里還是用到了上面用的 rune 數組,先轉為 rune 數組類型,反轉后,再轉回字符即可。示例
package main import "fmt" func main() { ?? ?a := "123345asdfg" ?? ?reverseStr := reverseString(a) ?? ?fmt.Println(reverseStr) } func reverseString(a string) string { ?? ?b := []rune(a) ?? ?for i := 0; i < len(b)/2; i++ { ?? ??? ?// 注意:不可以像下面這樣寫哦 ?? ??? ?//b[i] = b[len(b)-i-1] ?? ??? ?//b[len(b)-i-1] = b[i] ?? ??? ?// 可以理解為將兩個都先取出來再同時賦值,不得不說還是很簡便的,否則就需要一個第三方變量才能完成互換 ?? ??? ?b[i], b[len(b)-i-1] = b[len(b)-i-1], b[i] ?? ?} ?? ?return string(b) } // gfdsa543321
字符串大小寫操作
這個就很簡單了,直接調用 strings 包下提供的兩個方法就可以了
package main import ( ?? ?"fmt" ?? ?"strings" ) func main() { ?? ?str := "Hello World" ?? ?// 所有字母轉為大寫 ?? ?upper := strings.ToUpper(str) ?? ?fmt.Println(upper) ?? ?// 所有字母轉為小寫 ?? ?lower := strings.ToLower(str) ?? ?fmt.Println(lower) }
去除字符串首位空格
可以使用 strings 包下的方法 TrimSpace() ?,或者使用 Trim() ?方法,該方法可以刪除字符串中連續字符,用來刪除空格當然也是可以的
package main import ( ?? ?"fmt" ?? ?"strings" ) func main() { ?? ?str := " GO 非常好用 " ?? ?// 刪除連續字符 ?? ?str1 := strings.Trim(str, " ") ?? ?// 刪除首位空格 ?? ?str2 := strings.TrimSpace(str) ?? ?fmt.Println(str) ?? ?fmt.Println(str2) ?? ?fmt.Println(str1) }
合并字符串
join() 用于將字符串切片拼接為字符串,第一個參數傳字符切片,第二個是連接符,下面示例中就是使用的空格連接
package main import ( ?? ?"fmt" ?? ?"strings" ) func main() { ?? ?str := []string{"I", "Love", "GO"} ?? ?res := strings.Join(str, " ") ?? ?fmt.Println(res) }
分割字符串
strings 包提供了 Split()、SplitN、SplitAfter、SplitAfterN() ?4個函數來處理正則分割字符串
func Splic(s,sep string) []string
其中 s 為被正則分割的字符串,sep為分隔符
func SplicN(s,sep string,n int) []string
其中,s 為被正則分割的字符串,sep為分隔符,n為控制分割的片數,如果為 -1 則不限制
func SplicAfter(s,sep string) []string
與上面方法功能相同但是會保留分割符
func Splic(s,sep string) []string
與上面方法功能相同但是會保留分割符
package main import ( ?? ?"fmt" ?? ?"strings" ) func main() { ?? ?str := "I_Love_Golang_web" ?? ?split1 := strings.Split(str, "_") ?? ?split2 := strings.SplitN(str, "_", 3) ?? ?split3 := strings.SplitAfter(str, "_") ?? ?split4 := strings.SplitAfterN(str, "_", 2) ?? ?for i := range split1 { ?? ??? ?fmt.Println(split1[i]) ?? ?} ?? ?// I ?? ?// Love ?? ?// Golang ?? ?// web ?? ?for i := range split2 { ?? ??? ?fmt.Println(split2[i]) ?? ?} ?? ?// I ?? ?// Love ?? ?// Golang_web ?? ?for i := range split3 { ?? ??? ?fmt.Println(split3[i]) ?? ?} ?? ?// I_ ?? ?// Love_ ?? ?// Golang_ ?? ?// web ?? ?for i := range split4 { ?? ??? ?fmt.Println(split4[i]) ?? ?} ?? ?// I_ ?? ?// Love_Golang_web }
原文鏈接:https://blog.csdn.net/m0_46437589/article/details/128890954
相關推薦
- 2022-02-26 Android操作SQLite基本用法_Android
- 2023-04-01 pytorch常用函數之torch.randn()解讀_python
- 2024-01-13 Maven項目導入第三方jar包
- 2022-09-29 ASP.NET?MVC實現多選下拉框保存并顯示_實用技巧
- 2022-02-03 yii joinwith查數據的問題
- 2022-09-12 C++數據結構哈希表詳解_C 語言
- 2022-09-02 Oracle11g調整SGA方法詳解_oracle
- 2022-03-23 Unity3d實現跑馬燈廣播效果_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支