欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

介紹rune類型

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

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

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

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

rune如何處理字符?

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

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

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

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

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

值得注意的地方

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

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

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

介紹string類型

關(guān)于string類型,在go標準庫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語言的源碼中我們可以看到string的構(gòu)成:

type stringStruct struct {
   str unsafe.Pointer
   len int
}

stringStruct就是string的一個對象,這個str就是一個指向字符數(shù)組首位的一個指針.len就是這個字符串的長度.那么這個數(shù)組指的是什么呢?其實就是一個[]byte,string內(nèi)部就是通過這個字符切片組成的。而這個str就是指向了這個切片的首地址.因此也解釋了一個現(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指針指向的是一個字符常量的地址,這個地址里面的內(nèi)容是不可以被改變的,因為它是只讀的,但是這個指針可以指向不同的地址.

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

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

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

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

總結(jié)

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

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

相關(guān)文章

  • Go語言七篇入門教程一簡介初識

    Go語言七篇入門教程一簡介初識

    本篇是Go語言七篇入門系列第一篇Go語言初識及簡單介紹,從現(xiàn)在開始一起打開Go語言的學習大門吧,希望能夠有所幫助,祝大家多多進步
    2021-11-11
  • Go語言中定時器cron的基本使用教程

    Go語言中定時器cron的基本使用教程

    這篇文章主要給大家介紹了關(guān)于Go語言中定時器cron使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-01-01
  • Go語言反射reflect.Value實現(xiàn)方法的調(diào)用

    Go語言反射reflect.Value實現(xiàn)方法的調(diào)用

    本文主要介紹了Go語言反射reflect.Value實現(xiàn)方法的調(diào)用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • golang struct擴展函數(shù)參數(shù)命名警告解決方法

    golang struct擴展函數(shù)參數(shù)命名警告解決方法

    今天在使用VSCode編寫golang代碼時,定義一個struct,擴展幾個方法,需要的朋友可以參考下
    2017-02-02
  • 使用Go Validator有效驗證數(shù)據(jù)示例分析

    使用Go Validator有效驗證數(shù)據(jù)示例分析

    作為一名開發(fā)者,確保Go應(yīng)用中處理的數(shù)據(jù)是有效和準確的非常重要,Go Validator是一個開源的數(shù)據(jù)驗證庫,為Go結(jié)構(gòu)體提供強大且易于使用的數(shù)據(jù)驗證功能,本篇文章將介紹Go Validator庫的主要特點以及如何在Go應(yīng)用中使用它來有效驗證數(shù)據(jù)
    2023-12-12
  • Go 語言的指針的學習筆記

    Go 語言的指針的學習筆記

    這篇文章主要介紹了Go 語言的指針的學習筆記,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • Go語言實現(xiàn)關(guān)閉http請求的方式總結(jié)

    Go語言實現(xiàn)關(guān)閉http請求的方式總結(jié)

    面試的時候問到如何關(guān)閉http請求,一般人脫口而出的是關(guān)閉response.body,這是錯誤的。本文為大家整理了三個正確關(guān)閉http請求的方法,希望對大家有所幫助
    2023-02-02
  • Golang分布式鎖簡單案例實現(xiàn)流程

    Golang分布式鎖簡單案例實現(xiàn)流程

    分布式鎖是控制分布式系統(tǒng)之間同步訪問共享資源的一種方式。如果不同的系統(tǒng)或是同一個系統(tǒng)的不同主機之間共享了一個或一組資源,那么訪問這些資源時,需要通過一些互斥手段來防止彼此之間的干擾以保證一致性,在這種情況下,就需要使用分布式鎖了
    2022-12-12
  • Go工具鏈之go tool fix用法詳解

    Go工具鏈之go tool fix用法詳解

    go tool fix 是 Go 工具鏈中的一個命令,作用是把指定 Go 程序代碼包中的的所有舊版本代碼修正為新版本的代碼,本文將簡單介紹一下go tool fix的使用方法,感興趣的小伙伴可以參考閱讀下
    2023-07-07
  • Go語言官方依賴注入工具Wire的使用教程

    Go語言官方依賴注入工具Wire的使用教程

    依賴注入是一種實現(xiàn)控制反轉(zhuǎn)且用于解決依賴性問題的設(shè)計模式。Golang?中常用的依賴注入工具主要有?Inject?、Dig?等。但是今天主要介紹的是?Go?團隊開發(fā)的?Wire,一個編譯期實現(xiàn)依賴注入的工具,感興趣的可以了解一下
    2022-09-09

最新評論