How to iterate over a slice and build one string from the output\

huangapple go评论127阅读模式
英文:

How to iterate over a slice and build one string from the output\

问题

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

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

  1. func buildString() string {
  2. strSlice := []string{"one", "two", "three"}
  3. var bigString string
  4. for index, element := range strSlice {
  5. bigString += fmt.Sprintf("%d === %s\n", index, element)
  6. }
  7. return bigString
  8. }

在这个示例中,我们使用range关键字迭代strSlice切片,并使用+=运算符将每个项的索引和元素添加到bigString字符串中。最后,我们将bigString作为函数的返回值。

英文:

How would I iterate over a slice and build a new single string from the output, then return that string in a function?

For example if I wanted to read a slice and add an index to each item, then put the new changes in a single string and return it in a function:

  1. func buildString() string {
  2. strSlice := []string{"one", "two", "three"}
  3. for index, element := range strSlice{
  4. fmt.Println(index, "===", element)
  5. bigString := append(strSlice, fmt.Prinln(index, "===", element)
  6. }
  7. return bigString
  8. }

答案1

得分: 1

我完全同意马克的评论,但为了完整起见,以下是你尝试实现的问题的一个可能解决方案:

  1. func buildString(strSlice []string) string {
  2. var bigString string
  3. for index, element := range strSlice {
  4. bigString += fmt.Sprintf("%d === %s\n", index, element)
  5. }
  6. return bigString
  7. }
  8. func main() {
  9. strSlice := []string{"one", "two", "three"}
  10. result := buildString(strSlice)
  11. fmt.Print(result)
  12. }

但是,请按照马克推荐的参观Go之旅。

英文:

I fully agree with Marc's comment, but just for completeness, the following would be a possible solution to what you are trying to accomplish:

  1. func buildString(strSlice []string) string {
  2. var bigString string
  3. for index, element := range strSlice {
  4. bigString += fmt.Sprintf("%d === %s\n", index, element)
  5. }
  6. return bigString
  7. }
  8. func main() {
  9. strSlice := []string{"one", "two", "three"}
  10. result := buildString(strSlice)
  11. fmt.Print(result)
  12. }

But please, take the Tour of Go that Marc recommended to you.

答案2

得分: 1

你可以使用strings.Builder,它更高效。请尝试以下代码:

  1. func buildString(a []string) string {
  2. var sb strings.Builder
  3. for i, s := range a {
  4. sb.WriteString(strconv.Itoa(i))
  5. sb.WriteString(" === ")
  6. sb.WriteString(s)
  7. sb.WriteRune('\n')
  8. }
  9. return sb.String()
  10. }

基准测试结果如下:

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

代码如下:

  1. package main
  2. import (
  3. "fmt"
  4. "strconv"
  5. "strings"
  6. "testing"
  7. )
  8. func buildString(a []string) string {
  9. var sb strings.Builder
  10. for i, s := range a {
  11. sb.WriteString(strconv.Itoa(i))
  12. sb.WriteString(" === ")
  13. sb.WriteString(s)
  14. sb.WriteRune('\n')
  15. }
  16. return sb.String()
  17. }
  18. func buildString6(a []string) string {
  19. var sb strings.Builder
  20. for i, s := range a {
  21. sb.WriteString(strconv.Itoa(i))
  22. sb.WriteString(" === ")
  23. sb.WriteString(s)
  24. sb.WriteString("\n")
  25. }
  26. return sb.String()
  27. }
  28. func buildString5(a []string) string {
  29. var sb strings.Builder
  30. for i, s := range a {
  31. sb.WriteString(strconv.Itoa(i))
  32. sb.WriteString(" === " + s + "\n")
  33. }
  34. return sb.String()
  35. }
  36. func buildString4(a []string) string {
  37. var sb strings.Builder
  38. b := make([]byte, 0, 10)
  39. for i, s := range a {
  40. b = strconv.AppendInt(b[:0], int64(i), 10)
  41. b = append(b, " === "...)
  42. b = append(b, s...)
  43. b = append(b, '\n')
  44. sb.WriteString(string(b))
  45. }
  46. return sb.String()
  47. }
  48. func buildString3(a []string) string {
  49. var sb strings.Builder
  50. for i, s := range a {
  51. sb.WriteString(fmt.Sprintf("%d === %s\n", i, s))
  52. }
  53. return sb.String()
  54. }
  55. func buildString2(strSlice []string) string {
  56. var bigString string
  57. for index, element := range strSlice {
  58. bigString += fmt.Sprintf("%d === %s\n", index, element)
  59. }
  60. return bigString
  61. }
  62. func Benchmark1(b *testing.B) {
  63. strSlice := []string{"one", "two", "three"}
  64. for i := 0; i < b.N; i++ {
  65. _ = buildString(strSlice)
  66. }
  67. }
  68. func Benchmark2(b *testing.B) {
  69. strSlice := []string{"one", "two", "three"}
  70. for i := 0; i < b.N; i++ {
  71. _ = buildString2(strSlice)
  72. }
  73. }
  74. func Benchmark3(b *testing.B) {
  75. strSlice := []string{"one", "two", "three"}
  76. for i := 0; i < b.N; i++ {
  77. _ = buildString3(strSlice)
  78. }
  79. }
  80. func Benchmark4(b *testing.B) {
  81. strSlice := []string{"one", "two", "three"}
  82. for i := 0; i < b.N; i++ {
  83. _ = buildString4(strSlice)
  84. }
  85. }
  86. func Benchmark5(b *testing.B) {
  87. strSlice := []string{"one", "two", "three"}
  88. for i := 0; i < b.N; i++ {
  89. _ = buildString5(strSlice)
  90. }
  91. }
  92. func Benchmark6(b *testing.B) {
  93. strSlice := []string{"one", "two", "three"}
  94. for i := 0; i < b.N; i++ {
  95. _ = buildString6(strSlice)
  96. }
  97. }

Go 版本为 go1.17.1。

英文:

You may use strings.Builder, which is more efficient, try this:

  1. func buildString(a []string) string {
  2. var sb strings.Builder
  3. for i, s := range a {
  4. sb.WriteString(strconv.Itoa(i))
  5. sb.WriteString(&quot; === &quot;)
  6. sb.WriteString(s)
  7. sb.WriteRune(&#39;\n&#39;)
  8. }
  9. return sb.String()
  10. }

Benchmark:

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

Code:

  1. package main
  2. import (
  3. &quot;fmt&quot;
  4. &quot;strconv&quot;
  5. &quot;strings&quot;
  6. &quot;testing&quot;
  7. )
  8. func buildString(a []string) string {
  9. var sb strings.Builder
  10. for i, s := range a {
  11. sb.WriteString(strconv.Itoa(i))
  12. sb.WriteString(&quot; === &quot;)
  13. sb.WriteString(s)
  14. sb.WriteRune(&#39;\n&#39;)
  15. }
  16. return sb.String()
  17. }
  18. func buildString6(a []string) string {
  19. var sb strings.Builder
  20. for i, s := range a {
  21. sb.WriteString(strconv.Itoa(i))
  22. sb.WriteString(&quot; === &quot;)
  23. sb.WriteString(s)
  24. sb.WriteString(&quot;\n&quot;)
  25. }
  26. return sb.String()
  27. }
  28. func buildString5(a []string) string {
  29. var sb strings.Builder
  30. for i, s := range a {
  31. sb.WriteString(strconv.Itoa(i))
  32. sb.WriteString(&quot; === &quot; + s + &quot;\n&quot;)
  33. }
  34. return sb.String()
  35. }
  36. func buildString4(a []string) string {
  37. var sb strings.Builder
  38. b := make([]byte, 0, 10)
  39. for i, s := range a {
  40. b = strconv.AppendInt(b[:0], int64(i), 10)
  41. b = append(b, &quot; === &quot;...)
  42. b = append(b, s...)
  43. b = append(b, &#39;\n&#39;)
  44. sb.WriteString(string(b))
  45. }
  46. return sb.String()
  47. }
  48. func buildString3(a []string) string {
  49. var sb strings.Builder
  50. for i, s := range a {
  51. sb.WriteString(fmt.Sprintf(&quot;%d === %s\n&quot;, i, s))
  52. }
  53. return sb.String()
  54. }
  55. func buildString2(strSlice []string) string {
  56. var bigString string
  57. for index, element := range strSlice {
  58. bigString += fmt.Sprintf(&quot;%d === %s\n&quot;, index, element)
  59. }
  60. return bigString
  61. }
  62. func Benchmark1(b *testing.B) {
  63. strSlice := []string{&quot;one&quot;, &quot;two&quot;, &quot;three&quot;}
  64. for i := 0; i &lt; b.N; i++ {
  65. _ = buildString(strSlice)
  66. }
  67. }
  68. func Benchmark2(b *testing.B) {
  69. strSlice := []string{&quot;one&quot;, &quot;two&quot;, &quot;three&quot;}
  70. for i := 0; i &lt; b.N; i++ {
  71. _ = buildString2(strSlice)
  72. }
  73. }
  74. func Benchmark3(b *testing.B) {
  75. strSlice := []string{&quot;one&quot;, &quot;two&quot;, &quot;three&quot;}
  76. for i := 0; i &lt; b.N; i++ {
  77. _ = buildString3(strSlice)
  78. }
  79. }
  80. func Benchmark4(b *testing.B) {
  81. strSlice := []string{&quot;one&quot;, &quot;two&quot;, &quot;three&quot;}
  82. for i := 0; i &lt; b.N; i++ {
  83. _ = buildString4(strSlice)
  84. }
  85. }
  86. func Benchmark5(b *testing.B) {
  87. strSlice := []string{&quot;one&quot;, &quot;two&quot;, &quot;three&quot;}
  88. for i := 0; i &lt; b.N; i++ {
  89. _ = buildString5(strSlice)
  90. }
  91. }
  92. func Benchmark6(b *testing.B) {
  93. strSlice := []string{&quot;one&quot;, &quot;two&quot;, &quot;three&quot;}
  94. for i := 0; i &lt; b.N; i++ {
  95. _ = buildString6(strSlice)
  96. }
  97. }

go version go1.17.1

huangapple
  • 本文由 发表于 2021年10月1日 21:11:14
  • 转载请务必保留本文链接:https://go.coder-hub.com/69406465.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定