您好,登錄后才能下訂單哦!
這篇“Go中的字符串應用實例分析”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Go中的字符串應用實例分析”文章吧。
在編程語言中,字符串發揮著重要的角色。字符串背后的數據結構一般有兩種類型:
一種在編譯時指定長度,不能修改
一種具有動態的長度,可以修改。
比如:與Python 中的字符串一樣,Go 語言中的字符串不能被修改,只能被訪問。
在 Python 中,如果改變一個字符串的值會得到如下結果:
>>> 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 的表示結構如下:
type StringHeader struct { Data uintptr // Data 指向底層的字符數組 Len int // Len 用來表示字符串的長度 }
字符串的本質上是一串字符數組,每個字符都在存儲時對應了一個或多個整數。用這些整數來表示字符,比如打印 hello
的字節數組如下:
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
字符串有特殊標識,有兩種聲明方式:
var s1 string = `hello world`
var s2 string = "hello world"
字符串常量在詞法解析階段最終會被標記為 StringLit 類型的 Token 并被傳遞到編譯的下一個階段。
在語法分析階段,采取遞歸下降的方式讀取 UTF-8 字符,單撇號或雙引號是字符串的標識。
分析的邏輯位于 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 中有兩種字符串的檢查:一種是標準字符串以雙引號定義 ""
,如 "Hello,World"
, 還有一種是原始字符串,用 \\
定義的, 因此針對兩種字符串有兩種語法分析函數:
如果是單撇號,則調用 rawString 函數
如果是雙引號,則調用 stdString 函數
以上就是關于“Go中的字符串應用實例分析”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。