您好,登錄后才能下訂單哦!
這篇“Go中的字符串應(yīng)用實(shí)例分析”文章的知識點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Go中的字符串應(yīng)用實(shí)例分析”文章吧。
在編程語言中,字符串發(fā)揮著重要的角色。字符串背后的數(shù)據(jù)結(jié)構(gòu)一般有兩種類型:
一種在編譯時指定長度,不能修改
一種具有動態(tài)的長度,可以修改。
比如:與Python 中的字符串一樣,Go 語言中的字符串不能被修改,只能被訪問。
在 Python 中,如果改變一個字符串的值會得到如下結(jié)果:
>>> hi = "Hello" >>> hi 'Hello' >>> hi[0] = 'h' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'str' object does not support item assignment >>>
同理,在 Go 中也一樣:
package main import "fmt" func main() { var hello = "Hello" hello[1] = 'h' fmt.Println(hello) } // # command-line-arguments // string_in_go/main.go:8:11: cannot assign to hello[1] (strings are immutable)
字符串的終止方式有兩種:
一種是 C 語言的隱式聲明,以字符 “\0” 作為終止符
一種是 Go 語言的顯式聲明
Go 語言的 string 的表示結(jié)構(gòu)如下:
type StringHeader struct { Data uintptr // Data 指向底層的字符數(shù)組 Len int // Len 用來表示字符串的長度 }
字符串的本質(zhì)上是一串字符數(shù)組,每個字符都在存儲時對應(yīng)了一個或多個整數(shù)。用這些整數(shù)來表示字符,比如打印 hello
的字節(jié)數(shù)組如下:
package main import "fmt" func main() { var hello = "Hello" for i := 0; i < len(hello); i++ { fmt.Printf("%x ", hello[i]) } } // Output: 48 65 6c 6c 6f
字符串有特殊標(biāo)識,有兩種聲明方式:
var s1 string = `hello world`
var s2 string = "hello world"
字符串常量在詞法解析階段最終會被標(biāo)記為 StringLit 類型的 Token 并被傳遞到編譯的下一個階段。
在語法分析階段,采取遞歸下降的方式讀取 UTF-8 字符,單撇號或雙引號是字符串的標(biāo)識。
分析的邏輯位于 syntax/scanner.go 文件中:
func (s *scanner) stdString() { ok := true s.nextch() for { if s.ch == '"' { s.nextch() break } if s.ch == '\\' { s.nextch() if !s.escape('"') { ok = false } continue } if s.ch == '\n' { s.errorf("newline in string") ok = false break } if s.ch < 0 { s.errorAtf(0, "string not terminated") ok = false break } s.nextch() } s.setLit(StringLit, ok) } func (s *scanner) rawString() { ok := true s.nextch() for { if s.ch == '`' { s.nextch() break } if s.ch < 0 { s.errorAtf(0, "string not terminated") ok = false break } s.nextch() } // We leave CRs in the string since they are part of the // literal (even though they are not part of the literal // value). s.setLit(StringLit, ok) }
從上面的代碼可以看到,Go 中有兩種字符串的檢查:一種是標(biāo)準(zhǔn)字符串以雙引號定義 ""
,如 "Hello,World"
, 還有一種是原始字符串,用 \\
定義的, 因此針對兩種字符串有兩種語法分析函數(shù):
如果是單撇號,則調(diào)用 rawString 函數(shù)
如果是雙引號,則調(diào)用 stdString 函數(shù)
以上就是關(guān)于“Go中的字符串應(yīng)用實(shí)例分析”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。