中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Go中的字符串應用實例分析

發布時間:2022-05-05 09:13:10 來源:億速云 閱讀:122 作者:zzz 欄目:開發技術

這篇“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中的字符串應用實例分析”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

go
AI

天气| 牟定县| 汉中市| 南投市| 子洲县| 汝南县| 大余县| 宣化县| 侯马市| 崇州市| 乌拉特前旗| 萨嘎县| 石家庄市| 巴塘县| 平乡县| 湘乡市| 太保市| 门头沟区| 台山市| 黑水县| 大姚县| 昌都县| 湾仔区| 湘西| 舟曲县| 锦屏县| 金川县| 平江县| 泰宁县| 五常市| 夏河县| 花垣县| 浦城县| 吉木乃县| 景泰县| 固原市| 西乌珠穆沁旗| 灌云县| 广汉市| 五大连池市| 紫云|