如何将字符附加到Go中的字符串?
这不起作用:
s := "hello";
c := 'x';
fmt.Println(s + c);
无效操作:s + c(不匹配的字符串和符文类型)
这也不起作用:
s := "hello";
c := 'x';
fmt.Println(s + rune(c));
无效操作:s +符文(c)(不匹配类型字符串和符文)
答案 0 :(得分:37)
在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));
Omg你真的需要将每个char转换为字符串常量吗?是的,但不要担心,这只是因为类型系统和编译器正确地优化它。在引擎盖下,Java和Go都以相同的方式追加char。
如果您认为额外的输入很糟糕,只需比较上面每个示例中出现字符串关键字的次数。 :)
额外信息:(技术细节)
在Go字符串中不是符文序列,它们是 utf-8 编码的符文序列。当你对一个字符串进行搜索时会得到符文,但你不能简单地将一个符文附加到一个字符串上。 例如:欧元符号'€'是一个整数0x20AC(这称为代码点) 但是当您在utf-8中编码欧元符号时,您将获得3个字节:0xE2 0x82 0xAC http://www.fileformat.info/info/unicode/char/20aC/index.htm
所以附加一个char实际上是这样的:
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会错误地认为字符串是2byte char-s的序列,这在您需要编码美国必须死
之前是正确的。答案 1 :(得分:5)
简单但效率低下
尽管对于一个简单的程序来说,这很好用,但是效率低下。因为Go中的字符串是不可变的,所以每次我们想要更改字符串或添加到字符串时,我们都在创建新的字符串。对于需要在字符串中添加多个字符/字符串的情况,效率很低
s := "hello";
c := 'x';
fmt.Println(s + string(c));
使用strings.Builder(Go 1.10 +)
构建器用于使用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())
}