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