【问题标题】:Iterate over slice of strings and add 10 to each string遍历字符串切片并为每个字符串添加 10
【发布时间】:2018-12-24 19:32:53
【问题描述】:

我正在尝试遍历一段字符串并为每个字符串添加 10,例如:

package main

import "fmt"

func addTen(ss *[]string) {
    for _, s := range *ss {
        s = fmt.Sprintf("%s10", s)
    }
}

func main() {
    ss := []string{"a", "b", "c"}
    addTen(&ss)
    fmt.Println(ss)
}

编译器抱怨s 没有定义。

【问题讨论】:

  • 加上import "fmt",程序编译无误。
  • @ThunderCat 是的,但它不会将 10 添加到 ss 的字符串中。

标签: string go slice


【解决方案1】:

使用此代码将“10”附加到每个切片元素:

package main

import "fmt"

func addTen(ss []string) {
    for i, s := range ss {
        ss[i] = fmt.Sprintf("%s10", s)
    }
}

func main() {
    ss := []string{"a", "b", "c"}
    addTen(ss)
    fmt.Println(ss)
}

关键点:

  • 将字符串分配给切片元素。代码s = fmt.Sprintf("%s10", s) 赋值给局部变量s,被丢弃。
  • 此答案中的代码传递切片值而不是传递指向切片的指针。在这种情况下没有必要传递指针,传递指针也没有性能优势。只传递值更简单。

【讨论】:

  • 你能解释一下为什么传递切片而不是指针更惯用吗?
  • 在这种情况下不需要传递指针,传递指针也没有性能优势。惯用的方法是按值传递。
  • 如果切片很大,通过引用/指针传递是否没有性能提升?
  • 切片值包含指向后备数组、长度和容量的指针。切片值的大小始终为三个机器字。
  • 它修改后备数组,而不是切片值(指针、长度、容量)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
  • 2015-01-17
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 2021-01-11
  • 2010-09-09
相关资源
最近更新 更多