AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

Golang 中的字符串:常見錯誤和優秀實踐

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

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

M8y28資訊網——每日最新資訊28at.com

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

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

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

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

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

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

如果我們堅持在字符串類型變量中使用 nil 值,則應使用指針,如下所示:M8y28資訊網——每日最新資訊28at.com

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

這個時候輸出則為:M8y28資訊網——每日最新資訊28at.com

<nil>

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

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

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

address: 0xc00008a030, value: hello

2. 字符串是不可變的

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

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

上述代碼會導致編譯時錯誤,因為無法賦值給 tmp[0]。M8y28資訊網——每日最新資訊28at.com

更改字符串中單個字符的常見錯誤如下:M8y28資訊網——每日最新資訊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))}

輸出為:M8y28資訊網——每日最新資訊28at.com

JelloJ??好

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

這是因為我們打算修改的單個部分可能存儲在多個字節中,即使你想將變量轉換為符文類型并更改你想要的部分,我也不得不說,這是不可能做到的,因為它可能被放置在多個符文中,我們需要謹慎行事!M8y28資訊網——每日最新資訊28at.com

3. 字符串是字節數組

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

因此,當需要確定一個字符串類型變量的長度時,我們必須謹慎編碼。例如:M8y28資訊網——每日最新資訊28at.com

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

len 函數返回的是字符串的字節數,而不是字符數。當我們需要找出字符串的符文數時,可以使用 uft8.RuneCountIntString() 函數。M8y28資訊網——每日最新資訊28at.com

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

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

輸出為:M8y28資訊網——每日最新資訊28at.com

bytes:  6runes:  2

4. 字符串索引和forrange

在 Golang 中,使用索引檢索字符串的單個部分將為我們提供字符的 uint 值,并且只能檢索第一個字節。但在字符串變量的 for 循環中,我們可以訪問每個字符的符值:M8y28資訊網——每日最新資訊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) }}

輸出:M8y28資訊網——每日最新資訊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

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

5. 字符串平等

在 Golang 中,我們總是可以使用 == 來檢查簡單的字符串是否相等,但如果我們的變量存在隱藏點,則應在比較兩個字符串變量之前使用 unicode 規范包將其規范化:M8y28資訊網——每日最新資訊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. 高效字符串構建

使用“+”連接大量字符串的效率可能非常低。使用 strings.Builder 是高效構建字符串的最佳方法之一:M8y28資訊網——每日最新資訊28at.com

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

與傳統的 + 連接方法相比,這種方法速度更快,內存消耗更少,而且可以避免創建不必要的中間字符串。我們還可以使用 bytes.Buffer 軟件包來實現這一目標。M8y28資訊網——每日最新資訊28at.com

總結

  • 字符串的默認值是""
  • len 和 RuneCountIntString 函數具有不同的行為
  • 我們應該小心 for 循環和字符串
  • 字符串相等是我們需要更精確的地方

本文鏈接:http://www.tebozhan.com/showinfo-26-15187-0.htmlGolang 中的字符串:常見錯誤和優秀實踐

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

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

下一篇: 用Python實現答題卡識別!你學會了嗎?

標簽:
  • 熱門焦點
  • 小米降噪藍牙耳機Necklace分享:聽一首歌 讀懂一個故事

    在今天下午的小米Civi 2新品發布會上,小米還帶來了一款新的降噪藍牙耳機Necklace,我們也在發布結束的第一時間給大家帶來這款耳機的簡單分享。現在大家能見到最多的藍牙耳機
  • 消息稱迪士尼要拍真人版《魔發奇緣》:女主可能也找黑人演員

    8月5日消息,迪士尼確實有點忙,忙著將不少動畫改成真人版,繼《美人魚》后,真人版《白雪公主》、《魔發奇緣》也在路上了。據外媒消息稱,迪士尼將打造真人版
  • 0糖0卡0脂 旭日森林仙草烏龍茶優惠:15瓶到手29元

    旭日森林無糖仙草烏龍茶510ml*15瓶平時要賣為79.9元,今日下單領取50元優惠券,到手價為29.9元。產品規格:0糖0卡0脂,添加草本仙草汁,清涼爽口,富含茶多酚,保留
  • K8S | Service服務發現

    一、背景在微服務架構中,這里以開發環境「Dev」為基礎來描述,在K8S集群中通常會開放:路由網關、注冊中心、配置中心等相關服務,可以被集群外部訪問;圖片對于測試「Tes」環境或者
  • 如何使用JavaScript創建一只圖像放大鏡?

    譯者 | 布加迪審校 | 重樓如果您曾經瀏覽過購物網站,可能遇到過圖像放大功能。它可以讓您放大圖像的特定區域,以便瀏覽。結合這個小小的重要功能可以大大改善您網站的用戶體驗
  • 花7萬退貨退款無門:誰在縱容淘寶珠寶商家造假?

    來源:極點商業作者:楊銘在淘寶購買珠寶玉石后,因為保證金不夠賠付,店鋪關閉,退貨退款難、維權無門的比比皆是。&ldquo;提供相關產品鑒定證書,支持全國復檢,可以30天無理由退換貨。&
  • 大廠卷向扁平化

    來源:新熵作者丨南枝 編輯丨月見大廠職級不香了。俗話說,兵無常勢,水無常形,互聯網企業調整職級體系并不稀奇。7月13日,淘寶天貓集團啟動了近年來最大的人力制度改革,目前已形成一
  • 重估百度丨大模型,能撐起百度的“今天”嗎?

    自象限原創 作者|程心 羅輯2023年之前,對于自己的&ldquo;今天&rdquo;,百度也很迷茫。&ldquo;新業務到 2022 年底還是 0,希望 2023 年出來一個 1。&rdquo;這是2022年底,李彥宏
  • 上海舉辦人工智能大會活動,建設人工智能新高地

    人工智能大會在上海浦江兩岸隆重拉開帷幕,人工智能新技術、新產品、新應用、新理念集中亮相。8月30日晚,作為大會的特色活動之一的上海人工智能發展盛典人工
Top