日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

Golang 中的字符串:常見錯誤和優(yōu)秀實(shí)踐

來源: 責(zé)編: 時間:2023-10-26 17:10:41 269觀看
導(dǎo)讀在這篇文章中,我們將討論 Golang 中的字符串,并查看一些不同的場景,以避免常見錯誤。讓我們深入探討!1. 字符串是否可以為 nil?我們已經(jīng)對 Golang 中的字符串有了基本的了解,但我們可以從 Golang 字符串不能為 nil 開始,除非

在這篇文章中,我們將討論 Golang 中的字符串,并查看一些不同的場景,以避免常見錯誤。讓我們深入探討!m5i28資訊網(wǎng)——每日最新資訊28at.com

m5i28資訊網(wǎng)——每日最新資訊28at.com

1. 字符串是否可以為 nil?

我們已經(jīng)對 Golang 中的字符串有了基本的了解,但我們可以從 Golang 字符串不能為 nil 開始,除非您使用指向字符串的指針。m5i28資訊網(wǎng)——每日最新資訊28at.com

如下代碼所示,當(dāng)我們創(chuàng)建一個字符串變量時,默認(rèn)值必須是空的""。如果我們用 nil 值初始化字符串變量,我們將面臨在變量聲明中不能使用 nil 作為字符串值的錯誤。例如:m5i28資訊網(wǎng)——每日最新資訊28at.com

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

編譯器會提示我們不能使用 nil 賦予 string 類型。因此,我們可以只是定義變量,或者使用""作為默認(rèn)值:m5i28資訊網(wǎng)——每日最新資訊28at.com

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

如果我們堅(jiān)持在字符串類型變量中使用 nil 值,則應(yīng)使用指針,如下所示:m5i28資訊網(wǎng)——每日最新資訊28at.com

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

這個時候輸出則為:m5i28資訊網(wǎng)——每日最新資訊28at.com

<nil>

但是,我們必須謹(jǐn)慎使用這種方法。每次要為變量賦值時,我們都必須編寫更多的代碼,而且在賦新值之前還要檢查是否有零值或前一個值。m5i28資訊網(wǎng)——每日最新資訊28at.com

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

這個時候打印出來 s 的地址以及所指向的值:m5i28資訊網(wǎng)——每日最新資訊28at.com

address: 0xc00008a030, value: hello

2. 字符串是不可變的

Golang 中的字符串是不可變的,這意味著我們不能更改每個字符的值。例如:m5i28資訊網(wǎng)——每日最新資訊28at.com

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

上述代碼會導(dǎo)致編譯時錯誤,因?yàn)闊o法賦值給 tmp[0]。m5i28資訊網(wǎng)——每日最新資訊28at.com

更改字符串中單個字符的常見錯誤如下:m5i28資訊網(wǎng)——每日最新資訊28at.com

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))}

輸出為:m5i28資訊網(wǎng)——每日最新資訊28at.com

JelloJ??好

雖然第一個輸出顯示的結(jié)果符合我們的預(yù)期,但這并不是更改某個字符的正確方法。m5i28資訊網(wǎng)——每日最新資訊28at.com

這是因?yàn)槲覀兇蛩阈薷牡膯蝹€部分可能存儲在多個字節(jié)中,即使你想將變量轉(zhuǎn)換為符文類型并更改你想要的部分,我也不得不說,這是不可能做到的,因?yàn)樗赡鼙环胖迷诙鄠€符文中,我們需要謹(jǐn)慎行事!m5i28資訊網(wǎng)——每日最新資訊28at.com

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

在 Golang 中,字符串由字節(jié)(字節(jié)的片段)組成,某些字符需要存儲在多個字節(jié)中,例如:"?"。m5i28資訊網(wǎng)——每日最新資訊28at.com

因此,當(dāng)需要確定一個字符串類型變量的長度時,我們必須謹(jǐn)慎編碼。例如:m5i28資訊網(wǎng)——每日最新資訊28at.com

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ù)。m5i28資訊網(wǎng)——每日最新資訊28at.com

另一個常見的誤解是使用 uft8.RuneCountIntString() 來確定字符數(shù),但這并不是在任何情況下都正確,因?yàn)橐粋€字符串變量可能跨越多個符文。請看這個例子:m5i28資訊網(wǎng)——每日最新資訊28at.com

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

輸出為:m5i28資訊網(wǎng)——每日最新資訊28at.com

bytes:  6runes:  2

4. 字符串索引和forrange

在 Golang 中,使用索引檢索字符串的單個部分將為我們提供字符的 uint 值,并且只能檢索第一個字節(jié)。但在字符串變量的 for 循環(huán)中,我們可以訪問每個字符的符值:m5i28資訊網(wǎng)——每日最新資訊28at.com

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) }}

輸出:m5i28資訊網(wǎng)——每日最新資訊28at.com

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

在對字符串進(jìn)行迭代時,還要注意變量中可能存在的非 UTF8 字符,如果 Golang 無法將其理解為 UTF8,則會使用 unicode 替換而非實(shí)際值。m5i28資訊網(wǎng)——每日最新資訊28at.com

5. 字符串平等

在 Golang 中,我們總是可以使用 == 來檢查簡單的字符串是否相等,但如果我們的變量存在隱藏點(diǎn),則應(yīng)在比較兩個字符串變量之前使用 unicode 規(guī)范包將其規(guī)范化:m5i28資訊網(wǎng)——每日最新資訊28at.com

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)建字符串的最佳方法之一:m5i28資訊網(wǎng)——每日最新資訊28at.com

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 軟件包來實(shí)現(xiàn)這一目標(biāo)。m5i28資訊網(wǎng)——每日最新資訊28at.com

總結(jié)

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

本文鏈接:http://www.www897cc.com/showinfo-26-15187-0.htmlGolang 中的字符串:常見錯誤和優(yōu)秀實(shí)踐

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Golang中的錯誤處理:全面指南及示例

下一篇: 用Python實(shí)現(xiàn)答題卡識別!你學(xué)會了嗎?

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 直屏旗艦來了 iQOO 12和K70 Pro同臺競技

    旗艦機(jī)基本上使用的都是雙曲面屏幕,這就讓很多喜歡直屏的愛好者在苦等一款直屏旗艦,這次,你們等到了。據(jù)博主數(shù)碼閑聊站帶來的最新爆料稱,Redmi下代旗艦K70 Pro和iQOO 12兩款手
  • 中興AX5400Pro+上手體驗(yàn):再升級 雙2.5G網(wǎng)口+USB 3.0這次全都有

    2021年11月的時候,中興先后發(fā)布了兩款路由器產(chǎn)品,中興AX5400和中興AX5400 Pro,從產(chǎn)品命名上就不難看出這是隸屬于同一系列的,但在外觀設(shè)計(jì)上這兩款產(chǎn)品可以說是完全沒一點(diǎn)關(guān)系
  • 掘力計(jì)劃第 20 期:Flutter 混合開發(fā)的混亂之治

    在掘力計(jì)劃系列活動第20場,《Flutter 開發(fā)實(shí)戰(zhàn)詳解》作者,掘金優(yōu)秀作者,Github GSY 系列目負(fù)責(zé)人戀貓的小郭分享了Flutter 混合開發(fā)的混亂之治。Flutter 基于自研的 Skia 引擎
  • JavaScript學(xué)習(xí) -AES加密算法

    引言在當(dāng)今數(shù)字化時代,前端應(yīng)用程序扮演著重要角色,用戶的敏感數(shù)據(jù)經(jīng)常在前端進(jìn)行加密和解密操作。然而,這樣的操作在網(wǎng)絡(luò)傳輸和存儲中可能會受到惡意攻擊的威脅。為了確保數(shù)據(jù)
  • 共享單車的故事講到哪了?

    來源丨海克財(cái)經(jīng)與共享充電寶相差不多,共享單車已很久沒有被國內(nèi)熱點(diǎn)新聞關(guān)照到了。除了一再漲價和用戶直呼用不起了。近日多家媒體再發(fā)報(bào)道稱,成都、天津、鄭州等地多個共享單
  • 騰訊蓋樓,字節(jié)拆墻

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之&ldquo;想重溫暴刷深淵、30+技能搭配暴搓到爽的游戲體驗(yàn)嗎?一起上晶核,即刻暴打!&rdquo;曾憑借直播騰訊旗下代理格斗游戲《DNF》一
  • 網(wǎng)傳小米汽車開始篩選交付中心 建筑面積不低于3000平方米

    7月7日消息,近日有微博網(wǎng)友@長三角行健者爆料稱,據(jù)經(jīng)銷商集團(tuán)反饋,小米汽車目前已經(jīng)開始了交付中心的篩選工作,要求候選場地至少有120個車位,建筑不能低
  • 超閉合精工鉸鏈 徹底消滅縫隙 三星Galaxy Z Flip5與Galaxy Z Fold5發(fā)布

    2023年7月26日,三星電子正式發(fā)布了Galaxy Z Flip5與Galaxy Z Fold5。三星新一代折疊屏手機(jī)采用超閉合精工鉸鏈,讓折疊后的縫隙不再可見。同時,配合處
  • 三星顯示已開始為AR設(shè)備研發(fā)硅基LED微顯示屏

    7月18日消息,據(jù)外媒報(bào)道,隨著蘋果首款頭顯產(chǎn)品Vision Pro在6月份正式推出,AR/VR/MR等頭顯產(chǎn)品也就將成為各大公司下一個重要的競爭領(lǐng)域,對顯示屏這一關(guān)
Top 主站蜘蛛池模板: 南皮县| 霸州市| 泸溪县| 高淳县| 察雅县| 辽宁省| 道孚县| 广水市| 江门市| 开封市| 三明市| 无棣县| 韶关市| 迁安市| 驻马店市| 临漳县| 淮滨县| 威远县| 凤庆县| 香港| 仪征市| 密山市| 凤阳县| 永德县| 万山特区| 永州市| 潮州市| 星子县| 武川县| 右玉县| 巍山| 武胜县| 丹棱县| 齐齐哈尔市| 曲阳县| 衡山县| 开鲁县| 阳东县| 海安县| 米易县| 当涂县|