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

一文詳解Golang中字符串的常見(jiàn)錯(cuò)誤

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

1. 字符串是否可以為 nil

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

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

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

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

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

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

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

這個(gè)時(shí)候輸出則為:

<nil>

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

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

這個(gè)時(shí)候打印出來(lái) s 的地址以及所指向的值:

address: 0xc00008a030, value: hello

2. 字符串是不可變的

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

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

上述代碼會(huì)導(dǎo)致編譯時(shí)錯(cuò)誤,因?yàn)闊o(wú)法賦值給 tmp[0]。

更改字符串中單個(gè)字符的常見(jiàn)錯(cuò)誤如下:

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??好

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

這是因?yàn)槲覀兇蛩阈薷牡膯蝹€(gè)部分可能存儲(chǔ)在多個(gè)字節(jié)中,即使你想將變量轉(zhuǎn)換為符文類(lèi)型并更改你想要的部分,我也不得不說(shuō),這是不可能做到的,因?yàn)樗赡鼙环胖迷诙鄠€(gè)符文中,我們需要謹(jǐn)慎行事!

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

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

因此,當(dāng)需要確定一個(gè)字符串類(lèi)型變量的長(zhǎng)度時(shí),我們必須謹(jǐn)慎編碼。例如

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

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

另一個(gè)常見(jiàn)的誤解是使用 uft8.RuneCountIntString() 來(lái)確定字符數(shù),但這并不是在任何情況下都正確,因?yàn)橐粋€(gè)字符串變量可能跨越多個(gè)符文。請(qǐng)看這個(gè)例子:

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

輸出為:

bytes:  6
runes:  2

4. 字符串索引和forrange

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

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

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

5. 字符串平等

在 Golang 中,我們總是可以使用 == 來(lái)檢查簡(jiǎn)單的字符串是否相等,但如果我們的變量存在隱藏點(diǎn),則應(yīng)在比較兩個(gè)字符串變量之前使用 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 軟件包來(lái)實(shí)現(xiàn)這一目標(biāo)。

總結(jié)

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

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

相關(guān)文章

  • Go語(yǔ)言二維數(shù)組的傳參方式

    Go語(yǔ)言二維數(shù)組的傳參方式

    這篇文章主要介紹了Go語(yǔ)言二維數(shù)組的傳參方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • 深入淺出go依賴(lài)注入工具Wire的使用

    深入淺出go依賴(lài)注入工具Wire的使用

    但隨著項(xiàng)目規(guī)模的增長(zhǎng),組件之間的依賴(lài)關(guān)系變得復(fù)雜,手動(dòng)管理可能會(huì)很繁瑣,所以本文將深入探討一個(gè)備受歡迎的?Go?語(yǔ)言依賴(lài)注入工具——?Wire,感興趣的可以了解下
    2023-09-09
  • 聊聊golang中多個(gè)defer的執(zhí)行順序

    聊聊golang中多個(gè)defer的執(zhí)行順序

    這篇文章主要介紹了golang中多個(gè)defer的執(zhí)行順序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • Golang中for循環(huán)的用法示例詳解

    Golang中for循環(huán)的用法示例詳解

    for循環(huán)就是讓一段代碼循環(huán)的執(zhí)行,接下來(lái)通過(guò)本文給大家講解Golang中for循環(huán)的用法,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • 淺談Go語(yǔ)言中的次方用法

    淺談Go語(yǔ)言中的次方用法

    這篇文章主要介紹了淺談Go語(yǔ)言中的次方用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Go語(yǔ)言常見(jiàn)設(shè)計(jì)模式之裝飾模式詳解

    Go語(yǔ)言常見(jiàn)設(shè)計(jì)模式之裝飾模式詳解

    在?Go?語(yǔ)言中,雖然裝飾模式?jīng)]有像?Python?中應(yīng)用那么廣泛,但也有其用武之地,這篇文章我們就來(lái)一起看下裝飾模式在?Go?語(yǔ)言中的應(yīng)用吧
    2023-07-07
  • 線(xiàn)上golang grpc服務(wù)資源泄露問(wèn)題排查

    線(xiàn)上golang grpc服務(wù)資源泄露問(wèn)題排查

    這篇文章主要介紹了線(xiàn)上golang grpc服務(wù)資源泄露問(wèn)題排查,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Golang設(shè)計(jì)模式之適配器模式介紹和代碼示例

    Golang設(shè)計(jì)模式之適配器模式介紹和代碼示例

    適配器是一種結(jié)構(gòu)型設(shè)計(jì)模式, 它能使不兼容的對(duì)象能夠相互合作,可擔(dān)任兩個(gè)對(duì)象間的封裝器, 它會(huì)接收對(duì)于一個(gè)對(duì)象的調(diào)用, 并將其轉(zhuǎn)換為另一個(gè)對(duì)象可識(shí)別的格式和接口,本文將通過(guò)代碼示例詳細(xì)給大家介紹Golang的適配器模式
    2023-06-06
  • Go語(yǔ)言基礎(chǔ)入門(mén)應(yīng)用簡(jiǎn)介及常用命令

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

    這篇文章主要為大家介紹了Go語(yǔ)言基礎(chǔ)入門(mén)應(yīng)用簡(jiǎn)介及常用命令,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-11-11
  • golang使用mapstructure解析json

    golang使用mapstructure解析json

    mapstructure?是一個(gè)?Go?庫(kù),用于將通用映射值解碼為結(jié)構(gòu),這篇文章主要來(lái)和大家介紹一下golang如何使用mapstructure解析json,需要的可以參考下
    2023-12-12

最新評(píng)論

望都县| 晋宁县| 襄樊市| 峨眉山市| 江口县| 北辰区| 平阴县| 五大连池市| 吕梁市| 阿拉善左旗| 漳州市| 大宁县| 洛浦县| 广东省| 通山县| 襄城县| 滦平县| 固安县| 太保市| 兴安县| 德惠市| 广宗县| 丹寨县| 丰县| 蒙自县| 海伦市| 泸溪县| 北宁市| 富民县| 阿瓦提县| 新乡县| 鄢陵县| 定结县| 图木舒克市| 惠水县| 宁化县| 沙雅县| 建水县| 广汉市| 渝北区| 理塘县|