亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

一文詳解Golang中字符串的常見錯誤

 更新時間:2023年10月24日 10:45:26   作者:洛天楓  
這篇文章主要來和大家深入討論一下Golang?中的字符串,并查看一些不同的場景,以避免常見錯誤,對大家掌握golang有一定的幫助,需要的可以了解下

1. 字符串是否可以為 nil

我們已經(jīng)對 Golang 中的字符串有了基本的了解,但我們可以從 Golang 字符串不能為 nil 開始,除非您使用指向字符串的指針。

如下代碼所示,當(dāng)我們創(chuàng)建一個字符串變量時,默認值必須是空的""。如果我們用 nil 值初始化字符串變量,我們將面臨在變量聲明中不能使用 nil 作為字符串值的錯誤。例如:

func main() {
	var s string
	s = nil // Cannot use 'nil' as the type string
	fmt.Println(s)
}

編譯器會提示我們不能使用 nil 賦予 string 類型。因此,我們可以只是定義變量,或者使用""作為默認值:

func main() {
	var s string
	var ss = ""
	fmt.Println(s, ss)
}

如果我們堅持在字符串類型變量中使用 nil 值,則應(yīng)使用指針,如下所示:

func main() {
	var s *string
	fmt.Println(s)
}

這個時候輸出則為:

<nil>

但是,我們必須謹慎使用這種方法。每次要為變量賦值時,我們都必須編寫更多的代碼,而且在賦新值之前還要檢查是否有零值或前一個值。

func main() {
	var s *string
	tmp := "hello"
	s = &tmp
	fmt.Printf("address: %+v, value: %s", s, *s)
}

這個時候打印出來 s 的地址以及所指向的值:

address: 0xc00008a030, value: hello

2. 字符串是不可變的

Golang 中的字符串是不可變的,這意味著我們不能更改每個字符的值。例如:

func main() {
	tmp := "hello"
	tmp[0] = 'J'
	fmt.Println(tmp)
}

上述代碼會導(dǎo)致編譯時錯誤,因為無法賦值給 tmp[0]。

更改字符串中單個字符的常見錯誤如下:

func main() {
	tmp := "hello"
	tbs := []byte(tmp)
	tbs[0] = 'J'
	fmt.Println(string(tbs))

	chi := "你好"
	chiTBS := []byte(chi)
	chiTBS[0] = 'J'
	fmt.Println(string(chiTBS))
}

輸出為:

Jello
J??好

雖然第一個輸出顯示的結(jié)果符合我們的預(yù)期,但這并不是更改某個字符的正確方法。

這是因為我們打算修改的單個部分可能存儲在多個字節(jié)中,即使你想將變量轉(zhuǎn)換為符文類型并更改你想要的部分,我也不得不說,這是不可能做到的,因為它可能被放置在多個符文中,我們需要謹慎行事!

3. 字符串是字節(jié)數(shù)組

在 Golang 中,字符串由字節(jié)(字節(jié)的片段)組成,某些字符需要存儲在多個字節(jié)中,例如:"♥"。

因此,當(dāng)需要確定一個字符串類型變量的長度時,我們必須謹慎編碼。例如

func main() {
	tmp := "¥"
	fmt.Println("bytes: ", len(tmp))
	fmt.Println("runes: ", utf8.RuneCountInString(tmp))
}

len 函數(shù)返回的是字符串的字節(jié)數(shù),而不是字符數(shù)。當(dāng)我們需要找出字符串的符文數(shù)時,可以使用 uft8.RuneCountIntString() 函數(shù)。

另一個常見的誤解是使用 uft8.RuneCountIntString() 來確定字符數(shù),但這并不是在任何情況下都正確,因為一個字符串變量可能跨越多個符文。請看這個例子:

func main() {
	tmp := "??"
	fmt.Println("bytes: ", len(tmp))
	fmt.Println("runes: ", utf8.RuneCountInString(tmp))
}

輸出為:

bytes:  6
runes:  2

4. 字符串索引和forrange

在 Golang 中,使用索引檢索字符串的單個部分將為我們提供字符的 uint 值,并且只能檢索第一個字節(jié)。但在字符串變量的 for 循環(huán)中,我們可以訪問每個字符的符值:

func main() {
	tmp := "?¥%……&*"
	fmt.Printf("char at 0 index, has type %T and value is %+v\n", tmp[0], tmp[0])

	for _, t := range tmp {
		fmt.Printf("value is %+v type is %T\n", t, t)
	}
}

輸出:

char at 0 index, has type uint8 and value is 226
value is 10084 type is int32
value is 65509 type is int32
value is 37 type is int32
value is 8230 type is int32
value is 8230 type is int32
value is 38 type is int32
value is 42 type is int32

在對字符串進行迭代時,還要注意變量中可能存在的非 UTF8 字符,如果 Golang 無法將其理解為 UTF8,則會使用 unicode 替換而非實際值。

5. 字符串平等

在 Golang 中,我們總是可以使用 == 來檢查簡單的字符串是否相等,但如果我們的變量存在隱藏點,則應(yīng)在比較兩個字符串變量之前使用 unicode 規(guī)范包將其規(guī)范化:

func main() {
	cafe1 := "Café"
	cafe2 := "Cafe\u0301"

	normalizeCafe1 := norm.NFC.String(cafe1)
	normalizeCafe2 := norm.NFC.String(cafe2)
	fmt.Println(cafe1 == cafe2)
	fmt.Println(normalizeCafe1 == normalizeCafe2)
}

6. 高效字符串構(gòu)建

使用“+”連接大量字符串的效率可能非常低。使用 strings.Builder 是高效構(gòu)建字符串的最佳方法之一:

func main() {
	sb := strings.Builder{}
	for i := 0; i < 1000; i++ {
		sb.WriteString("hello ")
	}
	result := sb.String()
	fmt.Println(result)
}

與傳統(tǒng)的 + 連接方法相比,這種方法速度更快,內(nèi)存消耗更少,而且可以避免創(chuàng)建不必要的中間字符串。我們還可以使用 bytes.Buffer 軟件包來實現(xiàn)這一目標(biāo)。

總結(jié)

  • 字符串的默認值是""
  • lenRuneCountIntString 函數(shù)具有不同的行為
  • 我們應(yīng)該小心 for 循環(huán)和字符串
  • 字符串相等是我們需要更精確的地方

到此這篇關(guān)于一文詳解Golang中字符串的常見錯誤的文章就介紹到這了,更多相關(guān)go字符串內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文詳解Go語言中切片的底層原理

    一文詳解Go語言中切片的底層原理

    在Go語言中,切片作為一種引用類型數(shù)據(jù),相對數(shù)組而言是一種動態(tài)長度的數(shù)據(jù)類型,使用的場景也是非常多,所以本文主要來和大家聊聊切片的底層原理,需要的可以參考一下
    2023-06-06
  • golang?中?channel?的詳細使用、使用注意事項及死鎖問題解析

    golang?中?channel?的詳細使用、使用注意事項及死鎖問題解析

    這篇文章主要介紹了golang?中?channel?的詳細使用、使用注意事項及死鎖分析,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • 深入了解Golang的指針用法

    深入了解Golang的指針用法

    與C語言一樣,Go語言中同樣有指針,通過指針,我們可以只傳遞變量的內(nèi)存地址,而不是傳遞整個變量,這在一定程度上可以節(jié)省內(nèi)存的占用。本文將通過示例詳細講講Golang的指針用法,需要的可以參考一下
    2022-07-07
  • Golang設(shè)計模式之單例模式詳細講解

    Golang設(shè)計模式之單例模式詳細講解

    單例模式很容易記住。就像名稱一樣,它只能提供對象的單一實例,保證一個類只有一個實例,并提供一個全局訪問該實例的方法。本文就來聊聊Go語言中的單例模式,感興趣的小伙伴可以了解一下
    2023-01-01
  • go slice 擴容實現(xiàn)原理源碼解析

    go slice 擴容實現(xiàn)原理源碼解析

    這篇文章主要為大家介紹了go slice 擴容實現(xiàn)原理源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • golang 后臺進程的啟動和停止操作

    golang 后臺進程的啟動和停止操作

    這篇文章主要介紹了golang 后臺進程的啟動和停止操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go語言method詳解

    Go語言method詳解

    這篇文章主要介紹了Go語言method詳解,本文總結(jié)了在使用method的時候重要注意幾點、指針作為receiver、method繼承等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • Go語言基礎(chǔ)入門應(yīng)用簡介及常用命令

    Go語言基礎(chǔ)入門應(yīng)用簡介及常用命令

    這篇文章主要為大家介紹了Go語言基礎(chǔ)入門應(yīng)用簡介及常用命令,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2021-11-11
  • Go實現(xiàn)基于RSA加密算法的接口鑒權(quán)

    Go實現(xiàn)基于RSA加密算法的接口鑒權(quán)

    這篇文章主要介紹了Go實現(xiàn)基于RSA加密算法的接口鑒權(quán),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • go語言通過odbc訪問Sql Server數(shù)據(jù)庫的方法

    go語言通過odbc訪問Sql Server數(shù)據(jù)庫的方法

    這篇文章主要介紹了go語言通過odbc訪問Sql Server數(shù)據(jù)庫的方法,實例分析了Go語言通過odbc連接與查SQL Server詢數(shù)據(jù)庫的技巧,需要的朋友可以參考下
    2015-03-03

最新評論