83

たとえば、「sample.zip」で構成される文字列があります。文字列パッケージなどを使用して「.zip」拡張子を削除するにはどうすればよいですか?

4

6 に答える 6

257

試す:

basename := "hello.blah"
name := strings.TrimSuffix(basename, filepath.Ext(basename))

TrimSuffixは基本的に、ドットで延長された末尾の文字列を削除するように指示します。

文字列#TrimSuffix

于 2014-02-03T22:05:19.420 に答える
91

編集: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で実行されます。

于 2012-10-23T10:01:18.443 に答える
2

この方法も機能します。

var filename = "hello.blah"
var extension = filepath.Ext(filename)
var name = TrimRight(filename, extension)

しかし、おそらくポール・ルアンの方法はより効率的ですか?

于 2013-12-16T07:03:37.660 に答える
2

私は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

于 2020-06-09T09:21:45.383 に答える
1

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

https://golang.org/pkg/strings#LastIndexByte

于 2020-11-25T01:05:19.410 に答える
0

これは、パフォーマンスが1行向上しただけです。ここにあります:

filename := strings.Split(file.Filename, ".")[0]
于 2021-09-03T02:43:48.567 に答える