【问题标题】:How to iterate over a slice and build one string from the output\如何迭代切片并从输出构建一个字符串\
【发布时间】:2021-11-23 03:16:19
【问题描述】:

如何遍历切片并从输出中构建一个新的单个字符串,然后在函数中返回该字符串?

例如,如果我想读取一个切片并为每个项目添加一个索引,然后将新的更改放在一个字符串中并在函数中返回:

func buildString() string {
  strSlice := []string{"one", "two", "three"}
  for index, element := range strSlice{
  fmt.Println(index, "===", element)

  bigString := append(strSlice, fmt.Prinln(index, "===", element)
  }

return bigString
}

【问题讨论】:

  • 您有许多非常基本的错误。我建议您使用tour of Go 来学习语言。请记住阅读您使用的软件包的文档(例如:fmt

标签: string loops go


【解决方案1】:

我完全同意Marc's comment,但为了完整起见,以下可能是您尝试完成的解决方案:

func buildString(strSlice []string) string {
    var bigString string
    for index, element := range strSlice {
        bigString += fmt.Sprintf("%d === %s\n", index, element)
    }

    return bigString
}

func main() {
    strSlice := []string{"one", "two", "three"}
    result := buildString(strSlice)

    fmt.Print(result)
}

但是,请参加 Marc 向您推荐的 Tour of Go。

【讨论】:

  • 谢谢!!是的,我肯定会研究一下 golang 的基础知识!
【解决方案2】:

你可以用strings.Builder,效率更高,试试this

func buildString(a []string) string {
    var sb strings.Builder
    for i, s := range a {
        sb.WriteString(strconv.Itoa(i))
        sb.WriteString(" === ")
        sb.WriteString(s)
        sb.WriteRune('\n')
    }
    return sb.String()
}

基准测试:

Benchmark1-8  4203799   252 ns/op   56 B/op  3 allocs/op
Benchmark6-8  5044305   280 ns/op   56 B/op  3 allocs/op
Benchmark4-8  4332459   319 ns/op   72 B/op  3 allocs/op
Benchmark5-8  2792514   371 ns/op   56 B/op  3 allocs/op
Benchmark3-8  1000000  1018 ns/op  144 B/op  8 allocs/op
Benchmark2-8  1000000  1109 ns/op  152 B/op  8 allocs/op

代码:

package main

import (
    "fmt"
    "strconv"
    "strings"
    "testing"
)

func buildString(a []string) string {
    var sb strings.Builder
    for i, s := range a {
        sb.WriteString(strconv.Itoa(i))
        sb.WriteString(" === ")
        sb.WriteString(s)
        sb.WriteRune('\n')
    }
    return sb.String()
}
func buildString6(a []string) string {
    var sb strings.Builder
    for i, s := range a {
        sb.WriteString(strconv.Itoa(i))
        sb.WriteString(" === ")
        sb.WriteString(s)
        sb.WriteString("\n")
    }
    return sb.String()
}
func buildString5(a []string) string {
    var sb strings.Builder
    for i, s := range a {
        sb.WriteString(strconv.Itoa(i))
        sb.WriteString(" === " + s + "\n")
    }
    return sb.String()
}

func buildString4(a []string) string {
    var sb strings.Builder
    b := make([]byte, 0, 10)
    for i, s := range a {
        b = strconv.AppendInt(b[:0], int64(i), 10)
        b = append(b, " === "...)
        b = append(b, s...)
        b = append(b, '\n')
        sb.WriteString(string(b))
    }
    return sb.String()
}

func buildString3(a []string) string {
    var sb strings.Builder
    for i, s := range a {
        sb.WriteString(fmt.Sprintf("%d === %s\n", i, s))
    }
    return sb.String()
}

func buildString2(strSlice []string) string {
    var bigString string
    for index, element := range strSlice {
        bigString += fmt.Sprintf("%d === %s\n", index, element)
    }
    return bigString
}

func Benchmark1(b *testing.B) {
    strSlice := []string{"one", "two", "three"}
    for i := 0; i < b.N; i++ {
        _ = buildString(strSlice)
    }
}

func Benchmark2(b *testing.B) {
    strSlice := []string{"one", "two", "three"}
    for i := 0; i < b.N; i++ {
        _ = buildString2(strSlice)
    }
}

func Benchmark3(b *testing.B) {
    strSlice := []string{"one", "two", "three"}
    for i := 0; i < b.N; i++ {
        _ = buildString3(strSlice)
    }
}

func Benchmark4(b *testing.B) {
    strSlice := []string{"one", "two", "three"}
    for i := 0; i < b.N; i++ {
        _ = buildString4(strSlice)
    }
}

func Benchmark5(b *testing.B) {
    strSlice := []string{"one", "two", "three"}
    for i := 0; i < b.N; i++ {
        _ = buildString5(strSlice)
    }
}

func Benchmark6(b *testing.B) {
    strSlice := []string{"one", "two", "three"}
    for i := 0; i < b.N; i++ {
        _ = buildString6(strSlice)
    }
}

转到版本 go1.17.1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-31
    • 2023-01-08
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多