Go語言入門:string、rune

Go語言入門:string、rune

初始化

<code>msg := 

"hello world"

cnMsg :=

"你好世界"

multiline := `

select

*

from

table

where

col=

'val'

`/<code>

單行的字符串初始化和大部分語言一樣,使用雙引號,支持和python一樣的多行,但是用反單引號,就是鍵盤上按鍵區最左上角的那個符號。

長度

<code>msg := 

"hello world"

fmt.Println(

len

(msg)) cnMsg :=

"你好世界"

fmt.Println(

len

(cnMsg))/<code>

上面兩個打印字符串長度的代碼會輸出多少?11和4嗎?錯了,答案是11和16,len方法取得的結果是字符串所佔用的字節數,go語言中的字符串使用的是可變長的UTF8編碼,ASCII碼佔用1個字節,其它字符是2-4個字節,對於中文字符是3個字節。那如何取得我們預想的字符串長度:11和4?可以使用如下的兩個方法:

<code>

fmt

.Println

(

utf8

.RuneCountInString

(

msg

))

fmt

.Println

(

utf8

.RuneCountInString

(

cnMsg

))/<code>

這裡的rune可以認為用於表示一個utf8編碼,如果想把漢字字符串,一個個打印出來,可用如下方法實現:

<code>cnMsg := 

"你好世界"

msgRunes := []

rune

(cnMsg)

for

_, c :=

range

msgRunes { fmt.Println(

string

(c)) }/<code>

SLICE

<code>msg := 

"hello world"

fmt.Println(msg[:5])

fmt.Println(msg[6:])

fmt.Println(msg[3:5])

fmt.Println(msg[0])/<code>

對於ASCII碼字符串可以使用上面的方法進行類似Java substring的操作,注意最後一個返回的是h的ASCII碼值。對於中文字符如果也像上面的方式操作,打印出來的結果會是亂碼,因為上面的操作是基於字節索引的,中文的substring要像下面這樣操作,先轉成rune表示的UTF8編碼數組,然後基於UTF8編碼索引:

<code>cnMsg := 

"你好世界"

fmt.Println(

string

([]

rune

(cnMsg)[

0

:

1

]))/<code>


分享到:


相關文章: