如何将字符附加到Golang中的字符串?

coh*_*dar 27 string concat go

如何将字符附加到Go中的字符串?

这不起作用:

s := "hello";
c := 'x'; 
fmt.Println(s + c);
Run Code Online (Sandbox Code Playgroud)

无效操作:s + c(不匹配的类型字符串和符文)

这也不起作用:

s := "hello";
c := 'x'; 
fmt.Println(s + rune(c));
Run Code Online (Sandbox Code Playgroud)

无效操作:s + rune(c)(不匹配的类型字符串和符文)

coh*_*dar 45

在Go符文类型中不是字符类型,它只是int32的另一个名称.

如果你来自Java或类似的语言,这会让你感到惊讶,因为Java有char类型,你可以在字符串中添加char.

String s = "hello";
char c = 'x';
System.out.println(s + c);
Run Code Online (Sandbox Code Playgroud)

在Go中你需要更明确:

s := "hello";
c := 'x';
fmt.Println(s + string(c));
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

请注意,编码在编译时完成.

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的序列,这是正确的,直到你需要编码美国必须死

  • go字符串是_bytes_的序列,而不是符文.字符串上的字符串隐式返回符文以及字符串中的字节索引. (4认同)

ash*_*osh 7

简单但有点低效

虽然这对于一个简单的程序来说非常有效,但它的效率有点低。因为 Go 中的字符串是不可变的,所以每次我们想要更改字符串或添加到字符串时,我们都会创建新的字符串。对于我们需要将多个字符/字符串添加到字符串中的场景,那么它是低效的

s := "hello";
c := 'x';
fmt.Println(s + string(c));
Run Code Online (Sandbox Code Playgroud)

使用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())
    }
Run Code Online (Sandbox Code Playgroud)

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