如何在golang中有效地连接字符串数组和字符串

时间:2013-12-01 07:15:12

标签: go

我在golang中有一堆字符串和[]字符串,我需要连接它们。但由于某些原因,我需要摆脱很多空白。

这是代码

    tests := strings.TrimSpace(s[0])
    dep_string := make ([]string, len(tests) + len(sfinal))
    dep_string = append (dep_string,tests)
    for _,v := range sfinal {
      dep_string = append(dep_string,v)
    }
    fmt.Println("dep_String is ",dep_string)


Input: 
s[0] = "filename"
sfinal = [test test1]

expected output
[filename test test1]

actual output
[     filename test test1]

真的很奇怪;即使使用TrimSpace后我也无法摆脱多余的空间。是否有任何有效的方法来连接它们?

5 个答案:

答案 0 :(得分:7)

空白是由dep_string中的所有空元素引起的。当您使用make函数时,它会创建一个具有指定长度和容量的切片,并填充一堆任何内容。然后,当您使用append时,它会看到切片已达到其最大容量,扩展切片,然后在所有内容之后添加您的元素。解决方案是制作一个能够容纳所有元素的切片,但初始长度为零:

dep_string := make ([]string, 0, len(tests) + len(sfinal))

strings.TrimSpace是不必要的。您可以在http://blog.golang.org/slices

了解更多信息

答案 1 :(得分:4)

Bill DeRose和Saposhiente关于切片如何工作是正确的。

至于解决问题的简单方法,你也可以这样做(play):

fmt.Println("join is",strings.Join(append(s[:1],sfinal...)," "))

答案 2 :(得分:0)

当您执行作业dep_string := make ([]string, len(tests) + len(sfinal))时,Go会将已分配的内存归零,以便dep_string在其前面有len(tests) + len(sfinal)个空字符串。正如它现在写的那样,在所有那些归零字符串之后,你附加到切片的末尾。

运行this以查看代码中显示这些空白的位置。您可以通过制作长度为0且容量为len(tests) + len(sfinal)的切片来fix。然后,您可以使用strings.Join连接它们。

答案 3 :(得分:0)

这是解决问题的简单而有效的方法。

package main

import "fmt"

func main() {
    s := make([]string, 1, 4)
    s[0] = "filename"
    sfinal := []string{"test", "test1"}
    dep_string := append(s[:1], sfinal...)
    fmt.Println("dep_String is ", dep_string)
}

输出:

dep_String is  [filename test test1]

答案 4 :(得分:0)

当您执行赋值dep_string := make ([]string, len(tests) + len(sfinal))时,它会分配len(tests) + len(sfinal)个空字符串,在您的情况下它是10个空字符串,因此当您执行赋值fmt.Println("dep_String is ",dep_string)时,它将打印10 null字符串,因为fmt.Println(slice of string)将在两个元素之间添加空白,因此它将打印9个空格,因此它会在您追加后打印[ filename test test1],空格是10个空字符串之间的空格。