Golang字符串類型原理及其使用方法
Go字符串是不可變的字節(jié)序列,按照 UTF-8 編碼的 Unicode 碼點(diǎn)。字符串的內(nèi)部序列不可改變,這樣設(shè)計(jì)主要是為了減少內(nèi)存開支,字符串及其子串都可以使用相同的底層內(nèi)存。
ASCII碼、Unicode字符、UFT-8編碼
ASCII碼: 使用7位表示128個(gè)字符串(大小寫英文字母、數(shù)字、各種標(biāo)點(diǎn)及設(shè)備控制符)。
Unicode字符: 基本包括了世界上所有的文本字符,使用int32位的數(shù)據(jù)類型保存單個(gè)字符。Go中rune 數(shù)據(jù)類型就對應(yīng)該類型。
UTF-8編碼: 以字節(jié)為單位對Unicode碼點(diǎn)做變長編碼,兼容ASCII碼,相當(dāng)于是將不同字節(jié)大小的字符類型組裝到一起,使編碼更加緊湊。但是UTF-8編碼的字符串不能按下表直接訪問某一個(gè)字符,需要使用特殊的方式進(jìn)行處理。
字符串?dāng)?shù)據(jù)類型的基本操作
1.字符串長度
len函數(shù): len(str) 該函數(shù)能獲取字符串所占的字節(jié)數(shù),如果字符串是字母或者數(shù)字可以表示該字符串的字符個(gè)數(shù),如果包含漢字等特殊字符則無法表示字符個(gè)數(shù)。此時(shí)需要使用utf8.RuneCountInString(str)函數(shù)
package main import ( "fmt" "unicode/utf8" ) func main() { str1 := "abcd" str2 := "abc坎" fmt.Printf("len(str1) -> %d\n", len(str1)) fmt.Printf("len(str2) -> %d\n", len(str2)) fmt.Printf("字符數(shù)(str1) -> %d\n", utf8.RuneCountInString(str1)) fmt.Printf("字符數(shù)(str2) -> %d\n", utf8.RuneCountInString(str2)) } // 輸出 // len(str1) -> 4 // len(str2) -> 6 // 字符數(shù)(str1) -> 4 // 字符數(shù)(str2) -> 4
2.字符串前綴后綴及子字符串問題
基于utf8的優(yōu)勢,許多字符串的操作無需解碼,可以直接判斷某個(gè)字符串是否為前綴、后綴或者子字符串(判斷時(shí)采用逐字節(jié)比較的方法)
package main import ( "fmt" "strings" ) func main() { str := "abcd" s := "abcd" //前綴 if len(s) <= len(str) && str[:len(s)] == s { fmt.Println("Is PreFix!") } //后綴 if len(s) <= len(str) && str[len(str)-len(s):] == s { fmt.Println("Is SufFix!") } //子字符串 if strings.Contains(str, s) { fmt.Println("Is Contanins!") } } // 輸出 // Is PreFix! // Is SufFix! // Is Contanins!
3.字符串的遍歷
range: 該方法遍歷的是字符串的字符個(gè)數(shù)
package main import ( "fmt" ) func main() { str := "abcd愛蓮說" for i, v := range str { fmt.Printf("str[%d] is %c\n", i, v) } } // 輸出 // str[0] is a // str[1] is b // str[2] is c // str[3] is d // str[4] is 愛 // str[7] is 蓮 // str[10] is 說
4.字符串和字節(jié)slice的相互轉(zhuǎn)換
利用 [ ]byte 數(shù)據(jù)類型實(shí)現(xiàn)對字符串的操作,使用[]byte先對字符進(jìn)行編輯然后再將其轉(zhuǎn)換成字符串類型。
//不可編輯 s := "abcdef" //可編輯 b := []byte(s) str = string(b)
byte.Buffer工具: 該工具作為可以不斷寫入新的字符等byte數(shù)據(jù)
func AddByte(str string) string { var buf bytes.Buffer for _, v := range str { //添加原字符 buf.WriteRune(v) //插入空格 buf.WriteString(" ") } return buf.String() }
到此這篇關(guān)于Golang字符串類型原理及其使用方法的文章就介紹到這了,更多相關(guān)Golang字符串類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang使用minio替代文件系統(tǒng)的實(shí)戰(zhàn)教程
本文討論項(xiàng)目開發(fā)中直接文件系統(tǒng)的限制或不足,接著介紹Minio對象存儲(chǔ)的優(yōu)勢,同時(shí)給出Golang的實(shí)際示例代碼,包括初始化客戶端、讀取minio對象以及設(shè)置過期策略等,需要的朋友可以參考下2025-01-01詳解如何在Golang中監(jiān)聽多個(gè)channel
這篇文章主要為大家詳細(xì)介紹了如何在Golang中實(shí)現(xiàn)監(jiān)聽多個(gè)channel,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-03-03四種Golang實(shí)現(xiàn)middleware框架的方式小結(jié)
middleware是一般框架里面常用的形式,比如web框架、rpc框架等,本文為大家詳細(xì)介紹了四種實(shí)現(xiàn)middleawre的方式,感興趣的可以了解一下2024-03-03Go json omitempty如何實(shí)現(xiàn)可選屬性
在Go語言中,使用`omitempty`可以幫助我們在進(jìn)行JSON序列化和反序列化時(shí),忽略結(jié)構(gòu)體中的零值或空值,本文介紹了如何通過將字段類型改為指針類型,并在結(jié)構(gòu)體的JSON標(biāo)簽中添加`omitempty`來實(shí)現(xiàn)這一功能,例如,將float32修改為*float322024-09-09在ubuntu下構(gòu)建go語言開發(fā)環(huán)境的方法
這篇文章主要介紹了在ubuntu下構(gòu)建go語言開發(fā)環(huán)境的方法,需要的朋友可以參考下2014-10-10