web-dev-qa-db-ja.com

Golangのstrings.Split()スライスの最後のアイテムを返します

私は 分割 Goのファイル名でファイル拡張子を取得します(例:import ("strings") ; strings.Split("example.txt", "."))。このため、分割によって返されたスライスの最後のアイテム、つまり.

strings.Split( "ex.txt"、 "。")の場合、txtが必要です。

これ 質問は、

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

それに到達する唯一の方法です。つまり、Pythonのような-1はありません。同じ分割操作を2回実行していると感じているため、これは非常に無駄に思えます。

  • Goのスライスの最後のアイテムを取得するためのより良いコマンドはありませんか?
  • いいえの場合、最良のアプローチはSplitの結果を変数に書き込むことでしょうか、それとも上記を行うだけですか?

ありがとうございました!

9
patrick

分割の結果を2回呼び出すのではなく、変数に割り当てる必要があります。

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

(これにより、インデックスを作成する前に、ssが空である場合や明示的に予期しない何かに明示的に対処することができます(または強制される場合があります)。

これを何度も繰り返しており、1行ではなく2行(または2行とエラー処理)を使用しなければならない場合は、簡単に関数に抽象化できます。

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

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

結局のところ、関数の結果を引数として渡すことは、変数にバインドするのと本質的に同じ効果があります。

9
abarnert

strings.LastIndex は、これを非常にきれいにします。

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

「オーバーフロー」を返します。検索文字列が見つからない場合は、論理的な文字列全体を返します。

遊び場 ここ

7
Jon Egerton

自分で解析するのではなく、filepathパッケージを使用します。

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")
}

これはファイル名だけでなくフルパスでも機能します。

5
hc6