最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解?Go?中的字符串

 更新時間:2022年05月04日 14:17:36   作者:宇宙之一粟  
這篇文章主要介紹了深入理解?Go?中的字符串,在編程語言中,字符串發(fā)揮著重要的角色。字符串背后的數(shù)據(jù)結(jié)構(gòu)一般有兩種類型,一種在編譯時指定長度不能修改,一種具有動態(tài)的長度可以修改,下文更多相關(guān)資料需要的小伙伴可以參考一下

字符串的本質(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 中的字符串的文章就介紹到這了,更多相關(guān)Go 字符串內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang 執(zhí)行命令行的實現(xiàn)

    golang 執(zhí)行命令行的實現(xiàn)

    本文主要介紹了golang 執(zhí)行命令行的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • goland中文件頭自動注釋的操作

    goland中文件頭自動注釋的操作

    這篇文章主要介紹了goland中文件頭自動注釋的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • golang如何讓string轉(zhuǎn)int64

    golang如何讓string轉(zhuǎn)int64

    這篇文章主要介紹了golang如何讓string轉(zhuǎn)int64問題,
    2024-02-02
  • 解析Go 標(biāo)準(zhǔn)庫 http.FileServer 實現(xiàn)靜態(tài)文件服務(wù)

    解析Go 標(biāo)準(zhǔn)庫 http.FileServer 實現(xiàn)靜態(tài)文件服務(wù)

    http.FileServer 方法屬于標(biāo)準(zhǔn)庫 net/http,返回一個使用 FileSystem 接口 root 提供文件訪問服務(wù)的 HTTP 處理器。下面通過本文給大家介紹Go 標(biāo)準(zhǔn)庫 http.FileServer 實現(xiàn)靜態(tài)文件服務(wù)的相關(guān)知識,感興趣的朋友一起看看吧
    2018-08-08
  • Golang信號處理及如何實現(xiàn)進程的優(yōu)雅退出詳解

    Golang信號處理及如何實現(xiàn)進程的優(yōu)雅退出詳解

    這篇文章主要給大家介紹了關(guān)于Golang信號處理及如何實現(xiàn)進程的優(yōu)雅退出的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • Golang文件讀寫操作詳情

    Golang文件讀寫操作詳情

    這篇文章主要介紹了Golang文件讀寫操作詳情,文件是數(shù)據(jù)源(保存數(shù)據(jù)的地方)的一種,文件最主要的作用就是保存數(shù)據(jù),文件在程序中是以流的形式來操作的,更多詳細內(nèi)容需要的朋友可以參考一下
    2022-07-07
  • Go-Web框架中AOP方案的實現(xiàn)方式

    Go-Web框架中AOP方案的實現(xiàn)方式

    本文主要介紹了Go-Web框架中AOP方案的實現(xiàn)方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Go語言中Struct與繼承與匿名字段和內(nèi)嵌結(jié)構(gòu)體全面詳解

    Go語言中Struct與繼承與匿名字段和內(nèi)嵌結(jié)構(gòu)體全面詳解

    這篇文章主要介紹了Go語言中Struct與繼承與匿名字段和內(nèi)嵌結(jié)構(gòu)體,Go語言中通過結(jié)構(gòu)體的內(nèi)嵌再配合接口比面向?qū)ο缶哂懈叩臄U展性和靈活性,感興趣的可以了解一下
    2023-04-04
  • 解析GOROOT、GOPATH、Go-Modules-三者的關(guān)系

    解析GOROOT、GOPATH、Go-Modules-三者的關(guān)系

    這篇文章主要介紹了解析GOROOT、GOPATH、Go-Modules-三者的關(guān)系,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • golang trace view視圖詳解

    golang trace view視圖詳解

    在golang中可以使用go pprof的工具對golang程序進行性能分析,其中通過go trace 命令生成的trace view視圖對于我們分析系統(tǒng)延遲十分有幫助,鑒于當(dāng)前對trace view視圖的介紹還是很少,在粗略的看過trace統(tǒng)計原理后,將對這部分做比較詳細的介紹
    2023-08-08

最新評論

陕西省| 自贡市| 昭平县| 迁安市| 庄浪县| 肥西县| 横山县| 漯河市| 盈江县| 璧山县| 定远县| 临澧县| 巴塘县| 新营市| 高邑县| 花垣县| 长子县| 彰武县| 章丘市| 冷水江市| 肃宁县| 霍城县| 丰顺县| 富源县| 新龙县| 光山县| 禹州市| 鸡泽县| 临颍县| 井陉县| 鹿泉市| 新昌县| 盐源县| 高阳县| 苏尼特左旗| 黄山市| 安乡县| 资兴市| 陆丰市| 定安县| 巫溪县|