[英]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())
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.