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ù)類型就對(duì)應(yīng)該類型。
UTF-8編碼: 以字節(jié)為單位對(duì)Unicode碼點(diǎn)做變長(zhǎng)編碼,兼容ASCII碼,相當(dāng)于是將不同字節(jié)大小的字符類型組裝到一起,使編碼更加緊湊。但是UTF-8編碼的字符串不能按下表直接訪問(wèn)某一個(gè)字符,需要使用特殊的方式進(jìn)行處理。
字符串?dāng)?shù)據(jù)類型的基本操作
1.字符串長(zhǎng)度
len函數(shù): len(str) 該函數(shù)能獲取字符串所占的字節(jié)數(shù),如果字符串是字母或者數(shù)字可以表示該字符串的字符個(gè)數(shù),如果包含漢字等特殊字符則無(wú)法表示字符個(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.字符串前綴后綴及子字符串問(wèn)題
基于utf8的優(yōu)勢(shì),許多字符串的操作無(wú)需解碼,可以直接判斷某個(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愛(ài)蓮說(shuō)"
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 愛(ài)
// str[7] is 蓮
// str[10] is 說(shuō)4.字符串和字節(jié)slice的相互轉(zhuǎn)換
利用 [ ]byte 數(shù)據(jù)類型實(shí)現(xiàn)對(duì)字符串的操作,使用[]byte先對(duì)字符進(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang使用minio替代文件系統(tǒng)的實(shí)戰(zhàn)教程
本文討論項(xiàng)目開發(fā)中直接文件系統(tǒng)的限制或不足,接著介紹Minio對(duì)象存儲(chǔ)的優(yōu)勢(shì),同時(shí)給出Golang的實(shí)際示例代碼,包括初始化客戶端、讀取minio對(duì)象以及設(shè)置過(guò)期策略等,需要的朋友可以參考下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-03
使用Go語(yǔ)言編寫一個(gè)簡(jiǎn)單的Web框架
Go語(yǔ)言(又稱Golang)因其高效的性能和簡(jiǎn)潔的語(yǔ)法,在編寫Web框架方面表現(xiàn)出色,下面將詳細(xì)介紹如何使用Go語(yǔ)言編寫一個(gè)簡(jiǎn)單的Web框架,文中有詳細(xì)的代碼供大家參考,需要的朋友可以參考下2024-05-05
Go json omitempty如何實(shí)現(xiàn)可選屬性
在Go語(yǔ)言中,使用`omitempty`可以幫助我們?cè)谶M(jìn)行JSON序列化和反序列化時(shí),忽略結(jié)構(gòu)體中的零值或空值,本文介紹了如何通過(guò)將字段類型改為指針類型,并在結(jié)構(gòu)體的JSON標(biāo)簽中添加`omitempty`來(lái)實(shí)現(xiàn)這一功能,例如,將float32修改為*float322024-09-09
在ubuntu下構(gòu)建go語(yǔ)言開發(fā)環(huán)境的方法
這篇文章主要介紹了在ubuntu下構(gòu)建go語(yǔ)言開發(fā)環(huán)境的方法,需要的朋友可以參考下2014-10-10

