Skip to content

catenacyber/perfsprint

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

60 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

perfsprint

CI Go Report Card

Golang linter for performance, aiming at usages of fmt.Sprintf which have faster alternatives.

Installation

go install github.com/catenacyber/perfsprint@latest

Usage

perfsprint --fix ./...

Options

The 5 following options cover all optimizations proposed by the linter.

Some have suboptions for specific cases.

  • integer-format (formatting integer with the package strconv)
    • int-conversion : disable when the optimization adds a int/uint cast (readability)
  • error-format (formatting errors)
    • errorf : known behavior change avoiding panic
    • err-error : known behavior change panicking for nil errors
  • string-format (formatting strings)
    • sprintf1 : known behavior change avoiding panic
    • strconcat : disable turning some fmt.Sprintf to a string concatenation (readability)
  • bool-format (formatting bool with strconv.FormatBool)
  • hex-format (formatting bytes with hex.EncodeToString)

To disable fmt.Errorf optimization, you can use the flag -errorf=false This optimization is not always equivalent. The code

msg := "format string attack %s"
fmt.Errorf(msg)

will panic when its optimized version will not (so it should be safer).

To disable fmt.Sprintf("toto") optimization, you can use the flag -sprintf1=false This optimization is not always equivalent. The code

msg := "format string attack %s"
fmt.Sprintf(msg)

will panic when its optimized version will not (so it should be safer).

To enable err.Error() optimization, you can use the flag -err-error=true This optimization only works when the error is not nil, otherwise the resulting code will panic.

Replacements

fmt.Sprintf("%s", strVal)  ->  strVal
fmt.Sprintf("%t", boolVal) ->  strconv.FormatBool(boolBal)
fmt.Sprintf("%x", hash)    ->  hex.EncodeToString(hash)
fmt.Sprintf("%d", id)      ->  strconv.Itoa(id)
fmt.Sprintf("%v", version) ->  strconv.FormatUint(uint64(version), 10)

More in tests.

About

Golang linter to use strconv

Resources

License

Stars

Watchers

Forks

Packages

No packages published