たとえば、「sample.zip」で構成される文字列があります。文字列パッケージなどを使用して「.zip」拡張子を削除するにはどうすればよいですか?
6 に答える
試す:
basename := "hello.blah"
name := strings.TrimSuffix(basename, filepath.Ext(basename))
TrimSuffixは基本的に、ドットで延長された末尾の文字列を削除するように指示します。
編集:Goは先に進みました。キースの答えをご覧ください。
path/filepath.Extを使用して拡張子を取得します。次に、拡張子の長さを使用して、拡張子を引いた部分文字列を取得できます。
var filename = "hello.blah"
var extension = filepath.Ext(filename)
var name = filename[0:len(filename)-len(extension)]
または、 strings.LastIndexを使用して最後のピリオド(。)を見つけることもできfilepath.Ext
ますが、明示的にコーディングする必要がある処理を処理するエッジケース(拡張子なしなど)があるため、またはGoがピリオド以外の拡張区切り文字を使用する理論上のO/Sで実行されます。
この方法も機能します。
var filename = "hello.blah"
var extension = filepath.Ext(filename)
var name = TrimRight(filename, extension)
しかし、おそらくポール・ルアンの方法はより効率的ですか?
私はgo1.14.1を使用しfilepath.Ext
ていますが、機能しませんでした。正常にpath.Ext
機能します。
var fileName = "hello.go"
fileExtension := path.Ext(fileName)
n := strings.LastIndex(fileName, fileExtension)
fmt.Println(fileName[:n])
遊び場:https ://play.golang.org/p/md3wAq_obNc
ドキュメント: https://golang.org/pkg/path/#Ext
path
またはを必要としない例を次に示しますpath/filepath
。
func BaseName(s string) string {
n := strings.LastIndexByte(s, '.')
if n == -1 { return s }
return s[:n]
}
TrimSuffix
そしてそれは同様に速いようです:
PS C:\> go test -bench .
goos: windows
goarch: amd64
BenchmarkTrimFile-12 166413693 7.25 ns/op
BenchmarkTrimPath-12 182020058 6.56 ns/op
BenchmarkLast-12 367962712 3.28 ns/op
これは、パフォーマンスが1行向上しただけです。ここにあります:
filename := strings.Split(file.Filename, ".")[0]