簡體   English   中英

如何在Golang中將字符附加到字符串?

[英]How to append a character to a string in Golang?

如何在Go中將字符附加到字符串?

這不起作用:

s := "hello";
c := 'x'; 
fmt.Println(s + c);

無效操作:s + c(字符串和符文類型不匹配)

這也不起作用:

s := "hello";
c := 'x'; 
fmt.Println(s + rune(c));

無效操作:s + rune(c)(字符串和符文類型不匹配)

在 Go 中,符文類型不是字符類型,它只是 int32 的另一個名稱。

如果您來自 Java 或類似語言,這會讓您感到驚訝,因為 Java 具有 char 類型,您可以將 char 添加到字符串中。

String s = "hello";
char c = 'x';
System.out.println(s + c);

在 Go 中,您需要更加明確:

s := "hello";
c := 'x';
fmt.Println(s + string(c));

天哪,您真的需要將每個字符轉換為字符串常量嗎? 是的,但別擔心,這只是因為類型系統和編譯器正確優化了它。 在底層,Java 和 Go 都以相同的方式附加字符。

如果您認為額外的輸入很糟糕,只需比較上面每個示例中string關鍵字出現的次數。 :)

額外信息:(技術細節)

在 Go 中,字符串不是符文序列,它們是utf-8編碼的符文序列。 當你跨越一個字符串時,你會得到符文,但你不能簡單地將符文附加到一個字符串上。 例如:歐元符號“€”是一個整數 0x20AC(這稱為代碼點)但是當你用 utf-8 編碼歐元符號時,你會得到 3 個字節:0xE2 0x82 0xAC http://www.fileformat.info/info/unicode /char/20aC/index.htm

所以附加一個字符實際上是這樣的:

s = append(s, encodeToUtf8(c)) // Go
s = append(s, encodeToUtf16(c)) // Java

請注意,編碼是在編譯時完成的。

utf-8 可以編碼 1、2、3 或 4 個字節的字符。 utf-16 可以用 2 個或 4 個字節編碼一個字符。

所以Go通常為中文附加1個字節(對於ascii)或2、3、4個字節,而Java通常為中文附加2個字節(對於ascii)或4個字節。

由於我們(西方)使用的大多數字符都可以用 2 個字節進行編碼,Java 錯誤地認為字符串是 2 個字節的字符序列,這在您需要編碼之前是正確的 美國必須死

簡單但有點低效

雖然這對於一個簡單的程序來說非常有效,但它的效率有點低。 因為 Go 中的字符串是不可變的,所以每次我們想要更改字符串或添加到字符串時,我們都會創建新的字符串。 對於我們需要將多個字符/字符串添加到字符串中的場景,那么它是低效的

s := "hello";
c := 'x';
fmt.Println(s + string(c));

使用strings.Builder (Go 1.10+)

Builder 用於使用 Write 方法有效地構建字符串。 它最大限度地減少了內存復制。 零值即可使用。 不要復制非零的 Builder。

    package main

    import (
      "strings"
      "fmt"
    )
    
    func main() {
        var s string
        s = "hello";
        var c = 'x';
        var sb strings.Builder
        sb.WriteString(s)
        sb.WriteRune(c)
        fmt.Println(sb.String())
    }

https://play.golang.org/p/n1plG9eOxHD

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM