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) -> 42.字符串前綴后綴及子字符串問題
基于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)文章
Go語言學(xué)習(xí)之new函數(shù)的用法詳解
這篇文章主要為大家詳細(xì)介紹了Go語言中new()函數(shù)的相關(guān)知識(shí)以及具體用法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下2023-05-05
golang1.23版本之前 Timer Reset方法無法正確使用
在Go 1.23之前,使用`time.Reset`函數(shù)時(shí)需要先調(diào)用`Stop`并明確從timer的channel中抽取出東西,以避免潛在的問題,然而,這在實(shí)際代碼中難以實(shí)現(xiàn),因?yàn)樵O(shè)置定時(shí)器狀態(tài)和發(fā)送channel的操作并不是原子的,在某些情況下,這會(huì)導(dǎo)致timer在不應(yīng)該觸發(fā)時(shí)提前觸發(fā)2025-01-01
如何用go-zero 實(shí)現(xiàn)中臺(tái)系統(tǒng)
這篇文章主要介紹了如何用go-zero 實(shí)現(xiàn)中臺(tái)系統(tǒng),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
Go語言中的HTTP客戶端從標(biāo)準(zhǔn)庫到第三方庫
本文介紹了Go語言中的HTTP客戶端開發(fā),涵蓋標(biāo)準(zhǔn)庫和第三方庫使用、最佳實(shí)踐、高級(jí)功能、HTTP/2支持、安全考慮、性能優(yōu)化等內(nèi)容,通過本文,讀者可以構(gòu)建高效、可靠的HTTP客戶端應(yīng)用2026-05-05
Go語言滑動(dòng)窗口最大值的實(shí)現(xiàn)示例
本文主要介紹了Go語言滑動(dòng)窗口最大值的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-08-08
go語言用八百行代碼實(shí)現(xiàn)一個(gè)JSON解析器
這篇文章主要為大家介紹了go語言用八百行代碼實(shí)現(xiàn)一個(gè)JSON解析器實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07

