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

Go語(yǔ)言rune與字符串轉(zhuǎn)換的密切關(guān)系解析

 更新時(shí)間:2022年12月12日 10:32:50   作者:捶捶自己  
這篇文章主要為大家介紹了Go語(yǔ)言rune與字符串轉(zhuǎn)換的密切關(guān)系示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

介紹rune類型

golang中rune與字符串轉(zhuǎn)換的密切關(guān)系

rune 類型是 Go 語(yǔ)言的一種特殊數(shù)字類型。在 builtin/builtin.go 文件中,它的定義是type rune = int32.官方對(duì)它是這么解釋的:rune 是類型 int32 的別名,在所有方面都等價(jià)于它,用來區(qū)分字符值跟整數(shù)值.使用單引號(hào)定義 ,返回采用 UTF-8 編碼的 Unicode 碼點(diǎn).Go 語(yǔ)言通過 rune 處理中文,支持國(guó)際化多語(yǔ)言。

為什么要給int32取一個(gè)別名rune呢,為什么不直接使用int32?

這是因?yàn)閯e名的使用在大型項(xiàng)目重構(gòu)中作用最為明顯,它能解決代碼升級(jí)或遷移過程中可能存在的類型兼容性問題。在go語(yǔ)言中還有另外一個(gè)類型別名也是用來處理字符的,要知道在go語(yǔ)言中可沒有char這個(gè)類型,因此對(duì)于字符的處理就要特別對(duì)待。

rune如何處理字符?

rune主要表示字符碼點(diǎn),特別在處理中文方面尤其有效。下面是例子

func main() {
   s := "我是一個(gè)gophers"
   fmt.Println(len(s))
   fmt.Println(len([]rune(s)))
}
運(yùn)行結(jié)果:
19
11

通過對(duì)比我們可以發(fā)現(xiàn)中文字符每個(gè)占據(jù)3個(gè)字節(jié),如果使用byte則需要三個(gè)不同的值,而使用rune剛好可以完整表達(dá)。

引出golang中關(guān)于字符串的說明

  • Go 源代碼始終為 UTF-8。
  • 字符串可以包含任意字節(jié)。
  • 字符串文字中不包含字節(jié)級(jí)轉(zhuǎn)義符時(shí)字符串始終包含有效的 UTF-8 序列。
  • 代表 Unicode 碼點(diǎn)的字節(jié)序列稱為 rune
  • 在 Go 中不會(huì)保證字符串中的字符被規(guī)范化。

值得注意的地方

在前面已經(jīng)提到過,golang中沒有char這個(gè)概念,有的只是byte(uint8)單個(gè)字符的代表。因此要如何實(shí)現(xiàn)string呢?這個(gè)待會(huì)再講。我們現(xiàn)在主要介紹string遍歷過程中的問題。請(qǐng)看下面的例子

func main() {
   s := "我是一個(gè)gophers"
   for i, v := range s {
      fmt.Printf("第%d個(gè)值,類型為%T結(jié)果為:%v\n", i, v, string(v))
   }
   for i, v := range s {
      fmt.Printf("第%d個(gè)值,類型為%T結(jié)果為:%v\n", i, v, string(s[i]))
   }
}
運(yùn)行結(jié)果:
第0個(gè)值,類型為int32結(jié)果為:我
第3個(gè)值,類型為int32結(jié)果為:是
第6個(gè)值,類型為int32結(jié)果為:一
第9個(gè)值,類型為int32結(jié)果為:個(gè)
第12個(gè)值,類型為int32結(jié)果為:g
第13個(gè)值,類型為int32結(jié)果為:o
第14個(gè)值,類型為int32結(jié)果為:p
第15個(gè)值,類型為int32結(jié)果為:h
第16個(gè)值,類型為int32結(jié)果為:e
第17個(gè)值,類型為int32結(jié)果為:r
第18個(gè)值,類型為int32結(jié)果為:s
-------------------------------------------
第0個(gè)值,類型為int32結(jié)果為:? 
第3個(gè)值,類型為int32結(jié)果為:? 
第6個(gè)值,類型為int32結(jié)果為:? 
第9個(gè)值,類型為int32結(jié)果為:? 
第12個(gè)值,類型為int32結(jié)果為:g
第13個(gè)值,類型為int32結(jié)果為:o
第14個(gè)值,類型為int32結(jié)果為:p
第15個(gè)值,類型為int32結(jié)果為:h
第16個(gè)值,類型為int32結(jié)果為:e
第17個(gè)值,類型為int32結(jié)果為:r
第18個(gè)值,類型為int32結(jié)果為:s

通過比對(duì)和循環(huán)我們可以得知,golang中對(duì)于string的循環(huán),如果是中文則需要注意他的下標(biāo)序號(hào)是以3為差值,字符是以1為差值.通過s[i]v的比對(duì)可以知道為什么golang中需要選擇rune作為字符串的轉(zhuǎn)換值.如果轉(zhuǎn)化是一個(gè)中文的話,一個(gè)字節(jié)的byte是無法容納的,而rune解決了這個(gè)問題.

介紹string類型

關(guān)于string類型,在go標(biāo)準(zhǔn)庫(kù)builtin中有如下說明:

// string is the set of all strings of 8-bit bytes, conventionally but not
// necessarily representing UTF-8-encoded text. A string may be empty, but
// not nil. Values of string type are immutable.
type string string

也就是說:string是8位字節(jié)的集合,通常但不一定代表UTF-8編碼的文本.string可以為空,但是不能為nil.string的值是不能改變的. 而在go語(yǔ)言的源碼中我們可以看到string的構(gòu)成:

type stringStruct struct {
   str unsafe.Pointer
   len int
}

stringStruct就是string的一個(gè)對(duì)象,這個(gè)str就是一個(gè)指向字符數(shù)組首位的一個(gè)指針.len就是這個(gè)字符串的長(zhǎng)度.那么這個(gè)數(shù)組指的是什么呢?其實(shí)就是一個(gè)[]byte,string內(nèi)部就是通過這個(gè)字符切片組成的。而這個(gè)str就是指向了這個(gè)切片的首地址.因此也解釋了一個(gè)現(xiàn)象,為什么[]byte中的值可以被修改,而string中的值無法被修改.也正因如此copy內(nèi)置函數(shù)才可以將string類型復(fù)制為[]byte類型.

字符串的值不能被更改,但可以被替換. string在底層都是結(jié)構(gòu)體stringStruct{str: str_point, len: str_len},string結(jié)構(gòu)體的str指針指向的是一個(gè)字符常量的地址,這個(gè)地址里面的內(nèi)容是不可以被改變的,因?yàn)樗侵蛔x的,但是這個(gè)指針可以指向不同的地址.

為什么替換字符時(shí)string比[]byte效率慢?

由于每次替換string的值時(shí),stringstr指針無法進(jìn)行改變指向,因此程序內(nèi)部就需要去新開辟一個(gè)指針指向新的[]byte,然后先前分配的string內(nèi)存就會(huì)被GC所回收.這是導(dǎo)致string相較于[]byte操作低效的根本原因.

思考string、byte、rune之間的關(guān)系

Go語(yǔ)言把字符分 byte 和 rune 兩種類型處理.byte 是類型 unit8 的別名,用于存放占 1 字節(jié)的 ASCII 字符,如英文字符,返回的是字符原始字節(jié).rune 是類型 int32 的別名,用于存放多字節(jié)字符,如占 3 字節(jié)的中文字符,返回的是字符 Unicode 碼點(diǎn)值.

總結(jié)

  • string無法進(jìn)行修改,只能進(jìn)行替換
  • string底層由一個(gè)指針指向[]byte
  • rune主要用來表示碼點(diǎn)并處理大于1字節(jié)小于4個(gè)字節(jié)的特殊字符
  • 中文字符每個(gè)碼點(diǎn)占據(jù)多個(gè)字節(jié),并且在string循環(huán)中通過rune表示

以上就是Go語(yǔ)言rune與字符串轉(zhuǎn)換的密切關(guān)系解析的詳細(xì)內(nèi)容,更多關(guān)于Go rune字符串轉(zhuǎn)換的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go泛型實(shí)戰(zhàn)教程之如何在結(jié)構(gòu)體中使用泛型

    Go泛型實(shí)戰(zhàn)教程之如何在結(jié)構(gòu)體中使用泛型

    這篇文章主要介紹了Go泛型實(shí)戰(zhàn)教程之如何在結(jié)構(gòu)體中使用泛型,根據(jù)Go泛型使用的三步曲提到的:類型參數(shù)化、定義類型約束、類型實(shí)例化我們一步步來定義我們的緩存結(jié)構(gòu)體,需要的朋友可以參考下
    2022-07-07
  • Golang簡(jiǎn)介與基本語(yǔ)法的學(xué)習(xí)

    Golang簡(jiǎn)介與基本語(yǔ)法的學(xué)習(xí)

    這篇文章主要介紹了Golang簡(jiǎn)介與基本語(yǔ)法的學(xué)習(xí),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 從淺入深帶你掌握Golang數(shù)據(jù)結(jié)構(gòu)map

    從淺入深帶你掌握Golang數(shù)據(jù)結(jié)構(gòu)map

    在?Go?語(yǔ)言中,map?是一種非常常見的數(shù)據(jù)類型,它可以用于快速地檢索數(shù)據(jù)。本篇文章將介紹?Go?語(yǔ)言中的?map,包括?map?的定義、初始化、操作和優(yōu)化,需要的可以參考一下
    2023-04-04
  • golang?waitgroup的具體使用

    golang?waitgroup的具體使用

    本文主要介紹了golang?waitgroup的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • go開源Hugo站點(diǎn)渲染之模板詞法解析

    go開源Hugo站點(diǎn)渲染之模板詞法解析

    這篇文章主要為大家介紹了go開源Hugo站點(diǎn)渲染之模板詞法解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Go?Web編程添加服務(wù)器錯(cuò)誤和訪問日志

    Go?Web編程添加服務(wù)器錯(cuò)誤和訪問日志

    這篇文章主要為大家介紹了Go?Web編程添加服務(wù)器錯(cuò)誤日志和訪問日志的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • golang生成RSA公鑰和密鑰的實(shí)現(xiàn)方法

    golang生成RSA公鑰和密鑰的實(shí)現(xiàn)方法

    本文主要介紹了golang生成RSA公鑰和密鑰的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • 詳解Go語(yǔ)言如何判斷兩個(gè)對(duì)象是否相等

    詳解Go語(yǔ)言如何判斷兩個(gè)對(duì)象是否相等

    在編程中,判斷兩個(gè)對(duì)象是否相等是一項(xiàng)常見的任務(wù),同時(shí)判斷對(duì)象是否相等在很多情況下都非常重要,所以在接下來的內(nèi)容中,我們將詳細(xì)介紹在?Go?語(yǔ)言中如何判斷對(duì)象是否相等的方法和技巧,需要的可以參考一下
    2023-06-06
  • Go?for-range?的?value值地址每次都一樣的原因解析

    Go?for-range?的?value值地址每次都一樣的原因解析

    循環(huán)語(yǔ)句是一種常用的控制結(jié)構(gòu),在?Go?語(yǔ)言中,除了?for?關(guān)鍵字以外,還有一個(gè)?range?關(guān)鍵字,可以使用?for-range?循環(huán)迭代數(shù)組、切片、字符串、map?和?channel?這些數(shù)據(jù)類型,這篇文章主要介紹了Go?for-range?的?value值地址每次都一樣的原因解析,需要的朋友可以參考下
    2023-05-05
  • Go 語(yǔ)言中關(guān)于接口的三個(gè)

    Go 語(yǔ)言中關(guān)于接口的三個(gè)

    這篇文章主要介紹了Go 語(yǔ)言中關(guān)于接口的三個(gè)"潛規(guī)則",本文通過實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06

最新評(píng)論

杭锦后旗| 常熟市| 东宁县| 石棉县| 尼玛县| 聂荣县| 南郑县| 台江县| 连山| 家居| 固始县| 晋江市| 姜堰市| 阿拉善左旗| 通许县| 余姚市| 大同市| 岐山县| 东莞市| 香格里拉县| 灵台县| 衡阳县| 历史| 独山县| 湘潭县| 虹口区| 岳普湖县| 涿州市| 普安县| 利津县| 北票市| 岑巩县| 固阳县| 紫金县| 太保市| 长宁区| 普兰县| 东平县| 盈江县| 额尔古纳市| 连平县|