Skip to content

Instantly share code, notes, and snippets.

@ivanzoid
Last active June 7, 2026 16:55
Show Gist options
  • Select an option

  • Save ivanzoid/129460aa08aff72862a534ebe0a9ae30 to your computer and use it in GitHub Desktop.

Select an option

Save ivanzoid/129460aa08aff72862a534ebe0a9ae30 to your computer and use it in GitHub Desktop.
package main
import (
"strings"
"path/filepath"
)
func fileNameWithoutExtension(fileName string) string {
return strings.TrimSuffix(fileName, filepath.Ext(fileName))
}
@missinglink

Copy link
Copy Markdown

ok fair enough, filepath.Ext() agrees:

The extension is the suffix beginning at the final dot in the final element of path

Bash has a few different ways of getting the extension, depending on what you want:

~% FILE="example.tar.gz"

~% echo "${FILE%%.*}"
example

~% echo "${FILE%.*}"
example.tar

~% echo "${FILE#*.}"
tar.gz

~% echo "${FILE##*.}"
gz

@othell-sr

Copy link
Copy Markdown

It may be a good safeguard to have filename go through filepath.Base() first

return strings.TrimSuffix(filepath.Base(fileName), filepath.Ext(fileName))

@dxps

dxps commented Mar 11, 2025

Copy link
Copy Markdown

If the extension is static (always having a certain value), then a simple strings.CutSuffix(_,_) does the job. Example:

filenameWithoutExt, _ := strings.CutSuffix(filename, ".go")

@GeorgeTR1

GeorgeTR1 commented Jun 7, 2026

Copy link
Copy Markdown
func fileNameWithoutExtension(fileName string) string {
    if pos := strings.LastIndexByte(fileName, '.'); pos != -1 {
        return fileName[:pos]
    }
    return fileName    
}

This doesn't work properly if there are dots before the last path separator, i.e.
./file
will become an empty string.

From the Go source for filepath.Ext() (https://cs.opensource.google/go/go/+/refs/tags/go1.26.4:src/internal/filepathlite/path.go;l=215)

func Ext(path string) string {
	for i := len(path) - 1; i >= 0 && !IsPathSeparator(path[i]); i-- {
		if path[i] == '.' {
			return path[i:]
		}
	}
	return ""
}

So, I would suggest

func filenameNoExt(path string) string {
	for i := len(path) - 1; i >= 0 && !os.IsPathSeparator(path[i]); i-- {
		if path[i] == '.' {
			return path[:i]
		}
	}
	return path
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment