《Go語(yǔ)言從入門(mén)到精通》Go語(yǔ)言中的字符串處理_第1頁(yè)
《Go語(yǔ)言從入門(mén)到精通》Go語(yǔ)言中的字符串處理_第2頁(yè)
《Go語(yǔ)言從入門(mén)到精通》Go語(yǔ)言中的字符串處理_第3頁(yè)
《Go語(yǔ)言從入門(mén)到精通》Go語(yǔ)言中的字符串處理_第4頁(yè)
《Go語(yǔ)言從入門(mén)到精通》Go語(yǔ)言中的字符串處理_第5頁(yè)
已閱讀5頁(yè),還剩38頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論