版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Go語(yǔ)言中的字符串處理Go語(yǔ)言從入門(mén)到精通了解字符串的基本概念掌握Go語(yǔ)言中字符串處理的常用函數(shù)與邏輯01STRING02ENCODING03FUNCTIONStarget目標(biāo)了解字符串的編碼及非英文字符的特殊處理目錄導(dǎo)航7.1字符串相關(guān)的基礎(chǔ)知識(shí)Contents字符串的概念一串字符連起來(lái)的序列
字節(jié)(byte)
ASCII字符編碼byte、uint8和int8類(lèi)型
byte類(lèi)型實(shí)質(zhì)上是uint8類(lèi)型的別名
uint8類(lèi)型是8位二進(jìn)制數(shù)據(jù)表達(dá)的無(wú)符號(hào)整數(shù)
byte(uint8)類(lèi)型的數(shù)據(jù)范圍是[0,255]
int8是用8位二進(jìn)制數(shù)據(jù)來(lái)表達(dá)有符號(hào)整數(shù),表達(dá)的范圍是[-128,127][]byte與string
var
s
string
s
=
"abz"
byteSlice
:=
[]byte(s)
fmt.Printf("byteSlice的類(lèi)型是:%T,數(shù)值是:%v\n",
byteSlice,
byteSlice)
[]byte轉(zhuǎn)換為string
byteSlice
:=
[]byte{97,
98,
122}
s
:=
string(byteSlice)
fmt.Printf("s的類(lèi)型是:%T,數(shù)值是:%v\n",
s,
s)
字符串的基本操作
var
s1
string
//
用常規(guī)方法聲明字符串變量s1
s1
=
"abc"http://
給字符串變量賦值
s2
:=
"12345"http://
用簡(jiǎn)化方式聲明字符串變量s2并賦值
s3
:=
s1
+
s2//
用加號(hào)“+”來(lái)連接(合并)兩個(gè)字符串
//
用內(nèi)置函數(shù)len獲取字符串的長(zhǎng)度
t.Printfln("s1的長(zhǎng)度是:%v",
len(s1))
t.Printfln("s2的長(zhǎng)度是:%v",
len(s2))
t.Printfln("s3=%v,
s3的長(zhǎng)度是:%v",
s3,
len(s3))
//
用索引訪問(wèn)的方式獲取字符串變量中指定位置的字符,返回值是byte類(lèi)型
b
:=
s1[0]
t.Printfln("s1的第一個(gè)字符是:%v,變量類(lèi)型是:%T",
b,
b)
//
用切片中截取子切片的方式來(lái)截取子字符串,返回值還是string類(lèi)型
subStr1
:=
s3[2:5]
t.Printfln("subStr1=%v,變量類(lèi)型是:%T",
subStr1,
subStr1)雙引號(hào)或反引號(hào)括起字符串雙引號(hào)(”)括起來(lái)的字符串允許有轉(zhuǎn)義字符,例如”abc\n123”中的”\n”反引號(hào)(`)括起來(lái)的字符串稱(chēng)作“原始字符串”(rawstring),其中如果有轉(zhuǎn)義字符的話不會(huì)被轉(zhuǎn)義反引號(hào)中的字符串可以是多行的目錄導(dǎo)航7.2字符串支持多語(yǔ)言編碼的特殊處理Contents中文字符和其他一些多字節(jié)語(yǔ)言的處理問(wèn)題s
:=
"我們OK。"
t.Printfln("s的長(zhǎng)度:%v",
len(s))
s的長(zhǎng)度:11UTF-8編碼可變長(zhǎng)度的編碼方式,每個(gè)字符用1至4個(gè)字節(jié)長(zhǎng)度的編碼來(lái)表示對(duì)于ASCII碼表中原有的字符(包括所有的英語(yǔ)字母、數(shù)字和英文符號(hào)等),仍然占用一個(gè)字節(jié)我們常用的中文字符則一般要占據(jù)3個(gè)字節(jié)s的長(zhǎng)度:11byteSlice:[2301361452281871727975227128130]1110011011100100010011110100101111100011驗(yàn)證UTF-8編碼s
:=
"我們OK。"
t.Printfln("s的長(zhǎng)度:%v",
len(s))
byteSlice
:=
[]byte(s)
t.Printfln("byteSlice:%v",
byteSlice)
t.Printfln("%08b",
uint8(230))rune與[]rune
rune類(lèi)型是uint32類(lèi)型的別名是32個(gè)二進(jìn)制位表示的無(wú)符號(hào)整數(shù),可以說(shuō)是由4個(gè)字節(jié)組成
rune類(lèi)型是Go語(yǔ)言中專(zhuān)門(mén)用于表示Unicode編碼的數(shù)據(jù)類(lèi)型,更具體地說(shuō)是表示UTF-8類(lèi)型的Unicode編碼rune類(lèi)型可以表示任何用UTF-8編碼的字符,其中不足4個(gè)字節(jié)的將在左側(cè)補(bǔ)0s的長(zhǎng)度:11runeSlice:[2510520204797512290],runeSlice的長(zhǎng)度:5rune切片s
:=
"我們OK。"
t.Printfln("s的長(zhǎng)度:%v",
len(s))
runeSlice
:=
[]rune(s)
t.Printfln("runeSlice:%v,runeSlice的長(zhǎng)度:%v",
runeSlice,
len(runeSlice))
用rune對(duì)中文字符串進(jìn)行遍歷s
:=
"大家都說(shuō)nice。"
for
i
:=
0;
i
<
len(s);
i++
{
t.Printfln("字節(jié)序號(hào):%d,內(nèi)容:%v,類(lèi)型:%T",
i,
s[i],
s[i])}
for
i,
v
:=
range
s
{
t.Printfln("字節(jié)序號(hào):%d,內(nèi)容:%v,類(lèi)型:%T",
i,
v,
v)}
runeSlice
:=
[]rune(s)
for
i
:=
0;
i
<
len(runeSlice);
i++
{
t.Printfln("字節(jié)序號(hào):%d,內(nèi)容:%v,類(lèi)型:%T",
i,
runeSlice[i],
runeSlice[i])}
for
i,
v
:=
range
runeSlice
{
t.Printfln("字節(jié)序號(hào):%d,內(nèi)容:%v,類(lèi)型:%T",
i,
v,
v)}注意幾種遍歷方式的區(qū)別目錄導(dǎo)航7.3常見(jiàn)的字符串操作Contents判斷字符串中是否含有某個(gè)子串
if
strings.Contains(s,
"OK")
{
t.Printfln("%v
中含有子串
%v",
s,
"OK")
}
else
{
t.Printfln("%v
中不含有子串
%v",
s,
"OK")
}
獲取字符串中子串的位置
s
:=
"我們OK。"
pos
:=
strings.Index(s,
"們O")
t.Printfln("子串的位置在第%v個(gè)字節(jié)處開(kāi)始。",
pos)
注意幾種序號(hào)從零開(kāi)始(返回結(jié)果pos為3)獲取字符串中子串第n次出現(xiàn)的位置s
:=
"我們不能只靠我們自己,要尋找?guī)椭覀兊牧α俊?tmpS
:=
s
count
:=
0totalIndex
:=
0
strLen
:=
len(s)subLen
:=
len("我們")
for
{
index
:=
strings.Index(tmpS,
"我們")
if
index
<
0
{
break
}
count++
totalIndex
+=
index
if
totalIndex
>=
strLen
{
break
}
if
count
>=
3
{
break
}
totalIndex
+=
subLen
tmpS
=
s[totalIndex:]}獲取字符串中子串第n次出現(xiàn)的位置(方法1)s
:=
"我們不能只靠我們自己,要尋找?guī)椭覀兊牧α俊?tmpS
:=
s
count
:=
0totalIndex
:=
0
strLen
:=
len(s)subLen
:=
len("我們")
for
{
index
:=
strings.Index(tmpS,
"我們")
if
index
<
0
{
break
}
count++
totalIndex
+=
index
if
totalIndex
>=
strLen
{
break
}
if
count
>=
3
{
break
}
totalIndex
+=
subLen
tmpS
=
s[totalIndex:]}循環(huán)切片法獲取字符串中子串第n次出現(xiàn)的位置(方法2)s
:=
"我們不能只靠我們自己,要尋找?guī)椭覀兊牧α俊?
subLen
:=
len("我們")
list
:=
strings.SplitN(s,
"我們",
4)
if
len(list)
<
4
{
t.Printfln("沒(méi)有找到要求搜索的內(nèi)容")}
else
{
totalIndex
:=
len(list[0])
+
subLen
+
len(list[1])
+
subLen
+
len(list[2])
t.Printfln("子串第3次出現(xiàn)的位置在%v,前面的字符串是\"%v\",后面的字符串是\"%v\"",
totalIndex,
s[:totalIndex],
s[totalIndex+subLen:])}
使用strings.SplitN函數(shù)統(tǒng)計(jì)字符串中子串出現(xiàn)的次數(shù)s
:=
"我們不能只靠我們自己,要尋找?guī)椭覀兊牧α俊?
t.Printfln(`子串"我們"共出現(xiàn)了%v次`,
strings.Count(s,
"我們"))
判斷字符串的起始或結(jié)尾子串//
EndsWith
檢查字符串strA結(jié)尾是否是subStrAfunc
EndsWith(strA
string,
subStrA
string)
bool
{
return
strings.HasSuffix(strA,
subStrA)}
比較兩個(gè)字符串fmt.Printf("%x,
%x\n",
'我',
'們')
s1
:=
"我們"s2
:=
"\u6211\U00004eec"
if
s1
==
s2
{
fmt.Printf(`字符串"%v"與"%v"相等\n`,
s1,
s2)}
else
{
fmt.Printf(`字符串"%v"與"%v"不相等\n`,
s1,
s2)}
去除字符串首尾空白或其他字符//
Trim
去除字符串首尾的空白字符func
Trim(strA
string)
string
{
return
strings.TrimSpace(strA)}s
:=
"----大家都說(shuō)nice。----"
t.Printfln("字符串s:%v",
s)
t.Printfln("去除首部指定的字符后:%v",
strings.TrimLeft(s,
"-大"))
t.Printfln("去除尾部指定的字符后:%v",
strings.TrimRight(s,
"-大"))t.Printfln("去除首部指定的字符串后:%v",
strings.TrimPrefix(s,
"----大家"))
t.Printfln("去除尾部指定的字符串后:%v",
strings.TrimSuffix(s,
"nice。----"))
替換字符串中的子串oldString
:=
"天下是天下人的天下,不是一個(gè)人的天下。"
newString
:=
strings.Replace(oldString,
"天下",
"___",
3)
t.Printfln("第1次替換結(jié)果是:%v",
newString)
t.Printfln("第2次替換結(jié)果是:%v",
strings.Replace(oldString,
"天下",
"___",
-1))
第1次替換結(jié)果是:___是___人的___,不是一個(gè)人的天下。第2次替換結(jié)果是:___是___人的___,不是一個(gè)人的___。字符串大小寫(xiě)的轉(zhuǎn)換oldString
:=
"We
are
so
happy."
newString
:=
strings.ToUpper(oldString)
t.Printfln("全部轉(zhuǎn)換為大寫(xiě)后是:%v",
newString)
t.Printfln("再次轉(zhuǎn)換為全小寫(xiě)后是:%v",
strings.ToLower(newString))
切分字符串oldString
:=
"天下是天下人的天下,不是一個(gè)人的天下。"
strList
:=
strings.Split(oldString,
"天下")
t.Printfln("%#v",
strList)
strList
=
strings.Split(oldString,
"")
t.Printfln("%#v",
strList)
strList
=
strings.Split(oldString,
"天下是天下人的天下,不是一個(gè)人的天下。")
t.Printfln("%#v",
strList)
合并字符串切片s1
:=
"1,2,3,4,5"
strList
:=
strings.Split(s1,
",")
t.Printfln("%v",
strings.Join(strList,
"-"))
s2
:=
"
We
are
\n
very
happy.
"
strList
=
strings.Fields(s2)
t.Printfln("%v",
strings.Join(strList,
"
"))
生成重復(fù)子串組成的字符串t.Printfln("%v",
"我真的"+strings.Repeat("很想",
3)+"你")我真的很想很想很想你幾個(gè)Unicode包中的操作unicode.IsControl函數(shù):用于判斷字符是否是控制字符;unicode.IsDigit函數(shù):用于判斷字符是否是10進(jìn)制數(shù)字字符;unicode.IsNumber函數(shù):用于判斷字符是否為數(shù)字(與unicode.IsDigit函數(shù)功能接近,但能夠識(shí)別的數(shù)字更多,例如Unicode中的羅馬數(shù)字字符也能識(shí)別);unicode.IsLetter函數(shù):用于判斷字符是否為字母(注意包括漢字等,如果要鑒別字母,需要結(jié)合unicode.IsLower函數(shù)和unicode.IsUpper函數(shù));unicode.IsLower函數(shù):用于判斷字符是否為小寫(xiě)字母;unicode.IsUpper函數(shù):用于判斷字符是否為大寫(xiě)字母;unicode.IsPunct函數(shù):用于判斷字符是否為標(biāo)點(diǎn)符號(hào);unicode.IsSpace函數(shù):用于判斷字符是否為空白字符;unicode.IsSymbol函數(shù):用于判斷字符是否為符號(hào)字符;unicode.ToLower函數(shù):用于將字符轉(zhuǎn)換為小寫(xiě)(如果可以轉(zhuǎn)換的話,否則維持原樣);unicode.ToUpper函數(shù):用于將字符轉(zhuǎn)換為大寫(xiě)(如果可以轉(zhuǎn)換的話,否則維持原樣);unicode.ToTitle函數(shù):用于將字符轉(zhuǎn)換為標(biāo)題字符目錄導(dǎo)航7.4高級(jí)字符串操作Contents生成隨機(jī)字符串countT
:=
10
//
生成10個(gè)字符長(zhǎng)度的字符串
rand.Seed(time.Now().Unix())
//
初始化偽隨機(jī)序列
//
準(zhǔn)備碼表baseT
:=
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
//
初始化字符串resultT
:=
""
//
循環(huán)逐個(gè)字符生成for
i
:=
0;
i
<
countT;
i++
{
idxT
:=
rand.Intn(len(baseT))
resultT
+=
baseT[idxT:(idxT
+
1)]}關(guān)鍵代碼7.4.2 用strings.Builder實(shí)現(xiàn)不斷增長(zhǎng)的字符串var
builderT
strings.Buildervar
idxT
int
for
i
:=
0;
i
<
countT;
i++
{
idxT
=
rand.Intn(len(baseT))
builderT.WriteByte(baseT[idxT])}
println(builderT.String())
關(guān)鍵代碼用于字符串內(nèi)容讀取的strings.Readers
:=
"這是一個(gè)10斤重的西瓜。"readerT
:=
strings.NewReader(s)t.Printfln("字符串長(zhǎng)度為:%v",
readerT.Len())for
{
charT,
sizeT,
errT
:=
readerT.ReadRune()
if
errT
!=
nil
{
break
}
t.Printfln("讀取的字符為:%c(編碼:%v),字節(jié)數(shù)為:%v",
charT,
charT,
sizeT)}readerT.Seek(12,
io.SeekStart)
charT,
sizeT,
errT
:=
readerT.ReadRune()
if
errT
==
nil
{
t.Printfln("從字節(jié)索引12開(kāi)始讀取的字符為:%c(編碼:%v),字節(jié)數(shù)為:%v",
charT,
charT,
sizeT)}
buf1
:=
make([]byte,
5)
n,
errT
:=
readerT.ReadAt(buf1,
9)字符串與數(shù)字的相互轉(zhuǎn)化int類(lèi)型轉(zhuǎn)換為string類(lèi)型:strconv.Itoa(n)二進(jìn)制整數(shù)類(lèi)型轉(zhuǎn)換為string類(lèi)型:strconv.FormatInt(n,2)十進(jìn)制整數(shù)轉(zhuǎn)換為string類(lèi)型:strconv.FormatInt(n,10)十六進(jìn)制整數(shù)轉(zhuǎn)換為string類(lèi)型:strconv.FormatInt(n,16)byte類(lèi)型轉(zhuǎn)換為string類(lèi)型:
strconv.FormatInt(int64(n),10)任意整數(shù)類(lèi)型轉(zhuǎn)換為字符串//
IntegerToString
所有整數(shù)類(lèi)型轉(zhuǎn)換為string類(lèi)型func
IntegerToString(valueA
interface{})
string
{
switch
valueA.(type)
{
case
byte:
return
strconv.FormatInt(int64(valueA.(byte)),
10)
case
rune:
return
strconv.FormatInt(int64(valueA.(rune)),
10)
case
int64:
return
strconv.FormatInt(valueA.(int64),
10)
default:
return
""
}}
使用空接口(interface{})類(lèi)型作為參數(shù)的用途:可以接收任意類(lèi)型的參數(shù),然后可以用switch+.(type)語(yǔ)法分別處理從strings.Builder理解Go語(yǔ)言的接口var
buf
strings.Builder
for
i
:=
0;
i
<
3;
i++
{
fmt.Fprintf(&buf,
"這是第%
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 物探課程設(shè)計(jì)報(bào)告總結(jié)
- 礦井通風(fēng)課程設(shè)計(jì)心得
- 綜合通信系統(tǒng)課程設(shè)計(jì)
- 電工電子課程設(shè)計(jì)概述
- 英文秋天主題課程設(shè)計(jì)
- 研學(xué)谷物分揀課程設(shè)計(jì)
- 線上公交類(lèi)培訓(xùn)課程設(shè)計(jì)
- 按鍵電燈課程設(shè)計(jì)
- 職業(yè)素養(yǎng)課程設(shè)計(jì)總結(jié)
- 自然教育課程設(shè)計(jì)冬天
- 建設(shè)工程見(jiàn)證取樣管理規(guī)范
- 中國(guó)成人血脂異常防治指南解讀
- 醫(yī)學(xué)專(zhuān)家談靈芝孢子粉課件
- 彈性力學(xué)19年 吳家龍版學(xué)習(xí)通超星課后章節(jié)答案期末考試題庫(kù)2023年
- 有沒(méi)有租學(xué)位的協(xié)議書(shū)
- 車(chē)載智能計(jì)算芯片白皮書(shū)
- 住宅小區(qū)綠化管理規(guī)定
- 土建工程定額計(jì)價(jià)之建筑工程定額
- 2022年7月云南省普通高中學(xué)業(yè)水平考試物理含答案
- 學(xué)校安全工作匯報(bào)PPT
- 一年級(jí)語(yǔ)文上冊(cè)《兩件寶》教案1
評(píng)論
0/150
提交評(píng)論