【问题标题】:Return last item of strings.Split() slice in Golang返回Golang中strings.Split()切片的最后一项
【发布时间】:2018-10-22 23:39:54
【问题描述】:

我是 splitting 在 Go 中获取文件扩展名的文件名(例如 import ("strings") ; strings.Split("example.txt", "."))。 出于这个原因,我想返回分割返回的切片中的最后一项,即

对于strings.Split("ex.txt", "."),我要txt

This问题建议这样做

strings.Split("ex.txt", ".")[len(strings.Split("ex.txt", ".")) - 1]

是获得它的唯一方法。也就是说,没有像 Python 中的 -1 。这对我来说似乎很浪费,因为我觉得我们做了两次相同的拆分操作。

  • 在 Go 中是否有更好的命令来获取切片的最后一项?
  • 如果不是,最好的方法是将Split 的结果写入变量中,还是只执行上述操作?

谢谢!

【问题讨论】:

  • 请使用变量。
  • ...另一种方法:"ex.txt"[strings.LastIndex("ex.txt", ".")+1:],但仍然请为字符串使用变量,因为这很难看。

标签: go split slice file-extension


【解决方案1】:

您应该将拆分的结果分配给一个变量,而不是调用它两次。

ss := strings.Split(msg, ".")
s := ss[len(ss)-1]

(请注意,这允许(或可能强制)您在索引之前处理 ss 为空或其他明确的意外情况。)

如果您一遍又一遍地这样做,并且不得不使用两行(或两行加上错误处理)而不是一行,您可以轻松地将其抽象为一个函数:

func lastString(ss []string) string {
    return ss[len(ss)-1]
}

s1 := lastString(strings.Split("example.txt", "."))
s2 := lastString(strings.Split("example.jpg", "."))

毕竟,将函数的结果作为参数传递与将其绑定到变量的效果基本相同。

【讨论】:

    【解决方案2】:

    strings.LastIndex 使这非常整洁:

    s := "Hello,Stack,Overflow"
    last := s[strings.LastIndex(s, ",")+1:]
    fmt.Println(last)
    

    返回“溢出”。如果未找到搜索字符串,则返回整个字符串,这是合乎逻辑的。

    游乐场here

    【讨论】:

      【解决方案3】:

      我会使用文件路径包而不是自己解析它:

      import "path/filepath"
      
      s := "file.ext"
      ext := filepath.Ext(s)
      if len(ext) != 0 {
          fmt.Printf("ext = %s\n", ext[1:])
      } else {
          fmt.Printf("no ext\n")
      }
      

      这将适用于完整路径以及文件名。

      【讨论】:

      • 谢谢!我看到了那个包,但想为此手工制作。
      猜你喜欢
      • 1970-01-01
      • 2022-10-21
      • 1970-01-01
      • 2018-08-03
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多