成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 后端
在這篇文章中,我們將討論 Golang 中的字符串,并查看一些不同的場景,以避免常見錯誤。讓我們深入探討!

在這篇文章中,我們將討論 Golang 中的字符串,并查看一些不同的場景,以避免常見錯誤。讓我們深入探討!

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

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

如下代碼所示,當我們創建一個字符串變量時,默認值必須是空的""。如果我們用 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 值,則應使用指針,如下所示:

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

上述代碼會導致編譯時錯誤,因為無法賦值給 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??好

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

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

3. 字符串是字節數組

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

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

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

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

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

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

輸出為:

bytes:  6
runes:  2

4. 字符串索引和forrange

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

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 中,我們總是可以使用 == 來檢查簡單的字符串是否相等,但如果我們的變量存在隱藏點,則應在比較兩個字符串變量之前使用 unicode 規范包將其規范化:

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 是高效構建字符串的最佳方法之一:

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

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

總結

  • 字符串的默認值是""
  • len 和 RuneCountIntString 函數具有不同的行為
  • 我們應該小心 for 循環和字符串
  • 字符串相等是我們需要更精確的地方
責任編輯:趙寧寧 來源: 愛發白日夢的后端
相關推薦

2023-06-16 08:36:25

多線程編程數據競爭

2022-05-06 08:00:51

Golang編程語言Java

2022-08-24 08:16:33

容器安全容器

2019-09-06 09:00:00

開發技能代碼

2021-10-31 23:01:50

語言拼接字符串

2024-09-23 16:49:32

2021-05-24 10:24:42

Golang字符串Python

2024-01-23 13:00:00

Arthas命令Java

2021-03-08 08:23:24

Java字符串截取

2010-11-26 13:18:53

MySQL字符串

2023-10-26 11:07:48

Golang開發

2019-09-18 09:56:41

MySQLSQL函數

2010-06-28 15:18:51

SQL Server

2022-11-23 10:49:41

IT資產管理IT戰略

2024-11-28 09:43:04

2023-10-31 18:57:02

Java字符串

2021-07-01 15:17:14

MYSQL存儲數據庫

2015-04-08 10:27:43

JavaScript字符串操作函數

2021-07-30 06:22:37

C++字符型字符串

2023-09-03 22:26:41

DevOps代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 玩丰满女领导对白露脸hd | 一区二区三区四区视频 | 一级黄在线观看 | 久久久91精品国产一区二区精品 | 久久久久久国产精品 | 国产精品视频偷伦精品视频 | 91精品国产乱码久久久 | 久久国产欧美日韩精品 | 久热精品视频 | 久久久国产精品 | 精品三级在线观看 | 久久精品97 | 亚洲网址在线观看 | 欧美一级免费观看 | 在线观看亚洲精品 | 精品亚洲一区二区三区 | 欧美日韩在线视频一区 | 国产一区二区三区四区 | 91精品久久久久久久久久入口 | 日韩在线免费视频 | 久久精品一级 | 精品国产欧美日韩不卡在线观看 | 国产精品成人一区二区三区夜夜夜 | 午夜激情免费视频 | 精品一区二区视频 | 天堂在线免费视频 | 在线视频国产一区 | 欧美日韩综合视频 | 手机看片1| 国产亚洲精品综合一区 | 国产成人在线一区 | 亚洲综合网站 | 2019天天干天天操 | 99精品视频在线观看免费播放 | 日韩欧美一区二区三区免费看 | 亚洲欧美成人影院 | 亚洲色在线视频 | 午夜影院在线观看 | jvid精品资源在线观看 | av网址在线播放 | 在线观看成人 |