溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Go中的字符串應(yīng)用實(shí)例分析

發(fā)布時間:2022-05-05 09:13:10 來源:億速云 閱讀:115 作者:zzz 欄目:開發(fā)技術(shù)

這篇“Go中的字符串應(yīng)用實(shí)例分析”文章的知識點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Go中的字符串應(yīng)用實(shí)例分析”文章吧。

字符串的本質(zhì)

在編程語言中,字符串發(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è)資訊頻道。

向AI問一下細(xì)節(jié)

免責(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)容。

go
AI