
Go Naming
- 925 installs
- 137 repo stars
- Updated June 20, 2026
- cxuu/golang-skills
go-naming is a Go lint skill that automatically catches non-idiomatic identifier names across Go packages, types, functions, and constants before code review or commit.
About
go-naming is an Apache-2.0 cxuu/golang-skills checker grounded in Google and Uber Go style guides for packages, types, functions, methods, variables, constants, and receivers. It ships scripts/check-naming.sh, runnable via allowed Bash tooling, to flag SCREAMING_SNAKE_CASE constants, Get-prefixed getters, vague package names like util or helper, and receiver naming issues. Developers invoke go-naming when creating exported APIs or reviewing naming consistency without waiting for reviewer feedback. The skill complements go-packages for organization topics it explicitly does not cover.
- Runs scripts/check-naming.sh to detect SCREAMING_SNAKE_CASE, Get- getters, util/helper packages, and this/self receivers
- Applies to packages, types, functions, methods, variables, constants, and receivers
- Enforces Google and Uber Go style guide conventions
- Triggers automatically when creating new types, packages, or exported APIs
- 5-step naming decision flow for packages, interfaces, receivers, constants, and exported functions
Go Naming by the numbers
- 925 all-time installs (skills.sh)
- +39 installs in the week ending Aug 5, 2026 (Skillselion tracking)
- Ranked #148 of 1,352 Code Review & Quality skills by installs in the Skillselion catalog
- Security screen: LOW risk (skills.sh audit)
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/cxuu/golang-skills --skill go-namingAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 925 |
|---|---|
| repo stars | ★ 137 |
| Security audit | 3 / 3 scanners passed |
| Last updated | June 20, 2026 |
| Repository | cxuu/golang-skills ↗ |
How do you lint Go naming conventions automatically?
Automatically catch non-idiomatic Go names across packages, types, functions, and constants before code review or commit.
Who is it for?
Go developers creating exported APIs or large packages who want automated naming checks aligned with Google and Uber style guides before review.
Skip if: Teams needing package layout or module structure guidance, which go-naming defers to the separate go-packages skill.
When should I use this skill?
The user names Go identifiers, creates new exported types or packages, or asks to check Go naming conventions before commit or review.
What you get
A naming scan report listing SCREAMING_SNAKE_CASE, Get-prefix, util package, and receiver anti-patterns in Go code.
- Naming anti-pattern scan report
- Pre-review naming fix list
Files
Go Naming Conventions
Available Scripts
- `scripts/check-naming.sh` — Scans Go code for naming anti-patterns: SCREAMING_SNAKE_CASE constants, Get-prefixed getters, bad package names (util/helper/common), and receivers named "this"/"self". Run
bash scripts/check-naming.sh --helpfor options.
Core Principle
Names should:
- Not feel repetitive when used
- Take context into consideration
- Not repeat concepts that are already clear
Naming is more art than science—Go names tend to be shorter than in other languages.
---
Naming Decision Flow
What are you naming?
├─ Package → Short, lowercase, singular noun (no underscores, no mixedCaps)
├─ Interface → Method name + "-er" suffix when single-method (Reader, Writer)
├─ Receiver → 1-2 letter abbreviation of type (c for Client); consistent across methods
├─ Constant → MixedCaps; use iota for enums; no ALL_CAPS
├─ Exported func → Verb or verb-phrase in MixedCaps; no Get prefix for getters
├─ Variable → Length proportional to scope distance
│ ├─ Tiny scope (1-7 lines) → single letter (i, n, r)
│ ├─ Medium scope → short word (count, buf)
│ └─ Package-level / wide → descriptive (userAccountCount)
└─ Any name → Check: does it repeat package name or context? If yes, shorten it---
MixedCaps (Required)
Normative: All Go identifiers must use MixedCaps.
Underscores are allowed only in: test functions (TestFoo_InvalidInput), generated code, and OS/cgo interop.
---
Package Names
Normative: Packages must be lowercase with no underscores.
Short, lowercase, singular nouns. Avoid generic names like util, common, helper — prefer specific names: stringutil, httpauth, configloader.
// Good: user, oauth2, tabwriter
// Bad: user_service, UserService, count (shadows var)Read references/IDENTIFIERS.md when naming packages, deciding on import aliases, or choosing between generic and specific package names.
---
Interface Names
Advisory: One-method interfaces use "-er" suffix.
Name one-method interfaces by the method plus -er: Reader, Writer, Formatter. Honor canonical method names (Read, Write, Close, String) and their signatures.
Read references/IDENTIFIERS.md when defining new interfaces or implementing well-known method signatures.
---
Receiver Names
Normative: Receivers must be short abbreviations, used consistently.
One or two letters abbreviating the type, consistent across all methods: func (c *Client) Connect(), func (c *Client) Send(). Never use this or self.
Read references/IDENTIFIERS.md when choosing receiver names or ensuring consistency across methods.
---
Constant Names
Normative: Constants use MixedCaps, never ALL_CAPS or K prefix.
Name constants by role, not value: MaxRetries not Three, DefaultPort not Port8080.
const MaxPacketSize = 512
const defaultTimeout = 30 * time.SecondRead references/IDENTIFIERS.md when naming constants or choosing between role-based and value-based names.
---
Initialisms and Acronyms
Normative: Initialisms maintain consistent case throughout.
Initialisms (URL, ID, HTTP, API) must be all uppercase or all lowercase: HTTPClient, userID, ParseURL() — not HttpClient, orderId, ParseUrl().
Read references/IDENTIFIERS.md when using initialisms in compound names or for the full case table.
---
Function and Method Names
Advisory: No Get prefix for simple accessors; use verb-like names for actions.Getter for field owner is Owner(), not GetOwner(). Setter is SetOwner(). Use Compute or Fetch for expensive operations.
When functions differ only by type, include type at the end: ParseInt(), ParseInt64().
Read references/IDENTIFIERS.md when designing getter/setter APIs or naming function variants.
---
Variable Names
Variable naming balances brevity with clarity. Key principles:
- Scope-based length: Short names (
i,v) for small scopes; longer,
descriptive names for larger scopes
- Single-letter conventions: Use familiar patterns (
ifor index,
r/w for reader/writer)
- Avoid type in name: Use
usersnotuserSlice,namenotnameString - Prefix unexported globals: Use
_prefix for package-level unexported
vars/consts to prevent shadowing
for i, v := range items { ... } // small scope
pendingOrders := filterPending(orders) // larger scope
const _defaultPort = 8080 // unexported globalRead references/VARIABLES.md when naming local variables in functions over 15 lines.
---
Avoiding Repetition
Go names should not feel repetitive when used. Consider the full context:
- Package + symbol:
widget.New()notwidget.NewWidget() - Receiver + method:
p.Name()notp.ProjectName() - Context + type: In package
sqldb, useConnectionnotDBConnection
Read references/REPETITION.md when a package name and its exported symbols feel redundant.
---
Avoid Built-In Names
Never shadow Go's predeclared identifiers (error, string, len, cap, append, copy, new, make, etc.) as variable, parameter, or type names.
For detailed guidance: See go-declarations — "Avoid Using Built-In Names" section.
---
Quick Reference
| Element | Rule | Example |
|---|---|---|
| Package | lowercase, no underscores | package httputil |
| Exported | MixedCaps, starts uppercase | func ParseURL() |
| Unexported | mixedCaps, starts lowercase | func parseURL() |
| Receiver | 1-2 letter abbreviation | func (c *Client) |
| Constant | MixedCaps, never ALL_CAPS | const MaxSize = 100 |
| Initialism | consistent case | userID, XMLAPI |
| Variable | length ~ scope size | i (small), userCount (large) |
| Built-in names | Never shadow predeclared identifiers | See go-declarations |
Validation: After renaming identifiers, runbash scripts/check-naming.shto verify no naming anti-patterns remain. Then rungo build ./...to confirm the rename didn't break anything.
Related Skills
- Interface naming: See go-interfaces when naming interfaces with the
-ersuffix or choosing receiver types - Package naming: See go-packages when naming packages, avoiding
util/common, or resolving import collisions - Error naming: See go-error-handling when naming sentinel errors (
ErrFoo) or custom error types - Declaration scope: See go-declarations when variable name length depends on scope or when avoiding built-in shadowing
- Style principles: See go-style-core when balancing clarity vs concision in identifier names
Identifier Naming Rules
Detailed rules and examples for naming Go packages, interfaces, receivers, constants, initialisms, and functions.
Package Names
Normative: Packages must be lowercase with no underscores.
Package names must be:
- Concise and lowercase only
- No underscores (e.g.,
tabwriternottab_writer) - Not likely to shadow common variables
// Good: user, oauth2, k8s, tabwriter
// Bad: user_service (underscores), UserService (uppercase), count (shadows var)Avoid Uninformative Names
Advisory: Don't use generic package names.
Avoid names that tempt users to rename on import: util, common, helper, model, base. Prefer specific names: stringutil, httpauth, configloader.
Import Renaming
When renaming imports, the local name must follow package naming rules: import foopb "path/to/foo_go_proto" (not foo_pb with underscore).
---
Interface Names
Advisory: One-method interfaces use "-er" suffix.
By convention, one-method interfaces are named by the method name plus an -er suffix to construct an agent noun:
// Standard library examples
type Reader interface { Read(p []byte) (n int, err error) }
type Writer interface { Write(p []byte) (n int, err error) }
type Formatter interface { Format(f State, verb rune) }
type CloseNotifier interface { CloseNotify() <-chan bool }Honor canonical method names (Read, Write, Close, String) and their signatures. If your type implements a method with the same meaning as a well-known type, use the same name—call it String not ToString.
---
Receiver Names
Normative: Receivers must be short abbreviations, used consistently.
Receiver variable names must be:
- Short (one or two letters)
- Abbreviations for the type itself
- Consistent across all methods of that type
| Long Name (Bad) | Better Name |
|---|---|
func (tray Tray) | func (t Tray) |
func (info *ResearchInfo) | func (ri *ResearchInfo) |
func (this *ReportWriter) | func (w *ReportWriter) |
func (self *Scanner) | func (s *Scanner) |
// Good - consistent short receiver
func (c *Client) Connect() error
func (c *Client) Send(msg []byte) error
func (c *Client) Close() error
// Bad - inconsistent or long receivers
func (client *Client) Connect() error
func (cl *Client) Send(msg []byte) error
func (this *Client) Close() error---
Constant Names
Normative: Constants use MixedCaps, never ALL_CAPS or K prefix.
// Good
const MaxPacketSize = 512
const defaultTimeout = 30 * time.Second
// Bad
const MAX_PACKET_SIZE = 512 // no snake_case
const kMaxBufferSize = 1024 // no K prefixName by Role, Not Value
Advisory: Constants should explain what the value denotes.
// Good - names explain the role
const MaxRetries = 3
const DefaultPort = 8080
// Bad - names just describe the value
const Three = 3
const Port8080 = 8080---
Initialisms and Acronyms
Normative: Initialisms maintain consistent case throughout.
Initialisms (URL, ID, HTTP, API) should be all uppercase or all lowercase:
| English | Exported | Unexported |
|---|---|---|
| URL | URL | url |
| ID | ID | id |
| HTTP/API | HTTP | http |
| gRPC/iOS | GRPC/IOS | gRPC/iOS |
// Good: HTTPClient, userID, ParseURL()
// Bad: HttpClient, orderId, ParseUrl()---
Function and Method Names
Getters and Setters
Advisory: Don't use Get prefix for simple accessors.If you have a field called owner (unexported), the getter should be Owner() (exported), not GetOwner(). The setter, if needed, is SetOwner():
// Good
owner := obj.Owner()
if owner != user {
obj.SetOwner(user)
}
// Bad: c.GetName(), u.GetEmail(), p.GetID()Use Compute or Fetch for expensive operations: db.FetchUser(id), stats.ComputeAverage().
Naming Conventions
Advisory: Use noun-like names for getters, verb-like names for actions.
// Noun-like for returning values
func (c *Config) JobName(key string) string
func (u *User) Permissions() []Permission
// Verb-like for actions
func (c *Config) WriteDetail(w io.Writer) errorType Suffixes
When functions differ only by type, include type at the end: ParseInt(), ParseInt64(), AppendInt(), AppendInt64().
For a clear "primary" version, omit the type: Marshal() (primary), MarshalText() (variant).
Avoiding Repetition
This reference covers how to avoid redundant naming in Go by considering the context where names appear—package, receiver type, and surrounding code.
Package vs. Exported Symbol
Advisory: Don't repeat package name in exported symbols.
// Bad - repetitive at call site
package widget
func NewWidget() *Widget // widget.NewWidget()
func NewWidgetWithName(n string) // widget.NewWidgetWithName()
// Good - concise at call site
package widget
func New() *Widget // widget.New()
func NewWithName(n string) *Widget // widget.NewWithName()// Bad
package db
func LoadFromDatabase() error // db.LoadFromDatabase()
// Good
package db
func Load() error // db.Load()Method vs. Receiver Type
Advisory: Don't repeat receiver type in method name.
// Bad
func (c *Config) WriteConfigTo(w io.Writer) error
func (p *Project) ProjectName() string
// Good
func (c *Config) WriteTo(w io.Writer) error
func (p *Project) Name() stringContext vs. Local Names
Advisory: Omit information already clear from context.
// Bad - in package "ads/targeting/revenue/reporting"
type AdsTargetingRevenueReport struct{}
// Good
type Report struct{}// Bad - in package "sqldb"
type DBConnection struct{}
// Good
type Connection struct{}Complete Example
// Bad - excessive repetition
func (db *DB) UserCount() (userCount int, err error) {
var userCountInt64 int64
if dbLoadError := db.LoadFromDatabase("count(distinct users)", &userCountInt64); dbLoadError != nil {
return 0, fmt.Errorf("failed to load user count: %s", dbLoadError)
}
userCount = int(userCountInt64)
return userCount, nil
}
// Good - clear and concise
func (db *DB) UserCount() (int, error) {
var count int64
if err := db.Load("count(distinct users)", &count); err != nil {
return 0, fmt.Errorf("failed to load user count: %s", err)
}
return int(count), nil
}Variable Names
This reference provides detailed guidance on naming variables in Go, covering scope-based naming, single-letter conventions, and avoiding type redundancy.
Length Proportional to Scope
Advisory: Short names for small scopes, longer names for large scopes.
| Scope | Lines | Name Length |
|---|---|---|
| Small | 1-7 | 1-2 chars |
| Medium | 8-15 | short word |
| Large | 15-25 | descriptive |
| Very large | 25+ | full words |
// Good - short scope, short name
for i := 0; i < len(items); i++ {
process(items[i])
}
// Good - larger scope, clearer name
func processOrders(orders []*Order) error {
pendingOrders := filterPending(orders)
// ... 20+ lines of processing ...
return nil
}Single-Letter Variables
Advisory: Use single letters only when meaning is obvious.
Appropriate uses:
- Loop indices:
i,j,k - Coordinates:
x,y,z - Receivers: one or two letters
- Common types:
rforio.Reader,wforio.Writer - Short loops:
for _, n := range nodes
// Good - familiar conventions
func Copy(w io.Writer, r io.Reader) (int64, error)
for i, v := range values {
process(v)
}
// Bad - unclear single letters
func Process(a, b, c string) error // what are a, b, c?Avoid Type in Variable Name
Advisory: Don't include the type in the variable name.
| Repetitive (Bad) | Better |
|---|---|
var numUsers int | var users int |
var nameString string | var name string |
var primaryProject *Project | var primary *Project |
var userSlice []User | var users []User |
When disambiguating multiple forms, use meaningful qualifiers:
// Good - meaningful distinction
limitRaw := r.FormValue("limit")
limit, err := strconv.Atoi(limitRaw)
// Also good
limitStr := r.FormValue("limit")
limit, err := strconv.Atoi(limitStr)Prefix Unexported Globals with _
Source: Uber Go Style Guide
Prefix unexported top-level vars and consts with _ to clarify when they are used that they are global symbols.
Rationale: Top-level variables and constants have package scope. Using a generic name makes it easy to accidentally shadow the value in a different file.
// Bad - hard to distinguish from local variables
const (
defaultPort = 8080
defaultUser = "user"
)
func Bar() {
defaultPort := 9090 // shadows global, no compile error
fmt.Println("Default port", defaultPort)
}// Good - clearly global
const (
_defaultPort = 8080
_defaultUser = "user"
)Exception: Unexported error values use the err prefix without underscore:
var errUserNotFound = errors.New("user not found")
var errInvalidInput = errors.New("invalid input")#!/usr/bin/env bash
set -euo pipefail
VERSION="1.0.0"
SCRIPT_NAME="$(basename "$0")"
usage() {
cat <<EOF
$SCRIPT_NAME v$VERSION — Check Go code for common naming anti-patterns
USAGE
bash $SCRIPT_NAME [options] [path]
DESCRIPTION
Scans Go source files for naming violations based on Go style guidelines:
- SCREAMING_SNAKE_CASE constants (should be MixedCaps)
- Get-prefixed getter methods (should omit Get)
- Packages named util/helper/common/misc
- Receivers named "this" or "self"
Exits 0 if no violations found, 1 if violations found, 2 on error.
OPTIONS
-h, --help Show this help message
-v, --version Show version
--json Output results as JSON
--limit N Show at most N results (default: all)
ARGUMENTS
path Directory or Go file to check (default: current directory)
EXAMPLES
bash $SCRIPT_NAME
bash $SCRIPT_NAME ./cmd/server
bash $SCRIPT_NAME --json ./pkg/...
bash $SCRIPT_NAME myfile.go
EOF
}
JSON_OUTPUT=false
LIMIT=0
TARGET=""
while [[ $# -gt 0 ]]; do
case "$1" in
-h|--help) usage; exit 0 ;;
-v|--version) echo "$SCRIPT_NAME v$VERSION"; exit 0 ;;
--json) JSON_OUTPUT=true; shift ;;
--limit) LIMIT="${2:?error: --limit requires a number}"; shift 2 ;;
-*) echo "error: unknown option: $1" >&2; usage >&2; exit 2 ;;
*) TARGET="$1"; shift ;;
esac
done
TARGET="${TARGET:-.}"
json_escape() {
local s="$1"
s="${s//\\/\\\\}"
s="${s//\"/\\\"}"
s="${s//$'\t'/\\t}"
s="${s//$'\r'/}"
s="${s//$'\n'/\\n}"
printf '%s' "$s"
}
# Resolve target to a list of .go files (exclude _test.go and vendor)
find_go_files() {
local t="$1"
if [[ -f "$t" ]]; then
echo "$t"
elif [[ -d "$t" ]]; then
find "$t" -name '*.go' ! -name '*_test.go' ! -path '*/vendor/*' ! -path '*/.git/*' 2>/dev/null
else
# Handle ./... style patterns
local dir="${t%%/...}"
dir="${dir:-.}"
if [[ -d "$dir" ]]; then
find "$dir" -name '*.go' ! -name '*_test.go' ! -path '*/vendor/*' ! -path '*/.git/*' 2>/dev/null
else
echo "error: path not found: $t" >&2
exit 2
fi
fi
}
VIOLATIONS=()
add_violation() {
local file="$1" line="$2" rule="$3" message="$4"
VIOLATIONS+=("${file}:${line}|${rule}|${message}")
}
# Rule 1: SCREAMING_SNAKE_CASE constants
check_screaming_constants() {
local file="$1"
local line_num=0
while IFS= read -r line; do
line_num=$((line_num + 1))
# Match const declarations with ALL_CAPS_SNAKE names (2+ uppercase segments with underscore)
pat='^[[:space:]]*(const[[:space:]]+)[A-Z][A-Z0-9]*_[A-Z0-9_]+[[:space:]]'
if [[ "$line" =~ $pat ]]; then
local name
name=$(echo "$line" | sed -E -n 's/^[[:space:]]*const[[:space:]]+([A-Z][A-Z0-9]*_[A-Z0-9_]*).*/\1/p')
if [[ -n "$name" ]]; then
add_violation "$file" "$line_num" "screaming-const" "constant '$name' uses SCREAMING_SNAKE_CASE; use MixedCaps instead"
fi
fi
done < "$file"
}
# Rule 2: Get-prefixed getter methods
check_get_prefix() {
local file="$1"
local line_num=0
while IFS= read -r line; do
line_num=$((line_num + 1))
# Match: func (r Type) GetFoo(...) — exported getter with Get prefix
local re_get='^[[:space:]]*func[[:space:]]+\([^)]+\)[[:space:]]+Get([A-Z][a-zA-Z0-9]*)\('
if [[ "$line" =~ $re_get ]]; then
local method_name="Get${BASH_REMATCH[1]}"
# Skip GetX where X could be legitimate (e.g., GetByID is not a simple getter)
# Only flag simple GetField patterns (no preposition after Get)
case "${BASH_REMATCH[1]}" in
By*|From*|Or*|With*|All*) continue ;;
esac
add_violation "$file" "$line_num" "get-prefix" "method '$method_name' has Get prefix; Go getters should omit Get (use '${BASH_REMATCH[1]}')"
fi
done < "$file"
}
# Rule 3: Packages named util/helper/common/misc
check_bad_package_names() {
local file="$1"
local line_num=0
while IFS= read -r line; do
line_num=$((line_num + 1))
pat='^package[[:space:]]+(util|utils|helper|helpers|common|misc|shared|base|lib)$'
if [[ "$line" =~ $pat ]]; then
local pkg_name="${BASH_REMATCH[1]}"
add_violation "$file" "$line_num" "bad-package-name" "package '$pkg_name' is too generic; use a specific, descriptive name"
fi
# Only check the first package line
if [[ "$line" =~ ^package[[:space:]] ]]; then
break
fi
done < "$file"
}
# Rule 4: Receivers named "this" or "self"
check_bad_receivers() {
local file="$1"
local line_num=0
while IFS= read -r line; do
line_num=$((line_num + 1))
# Match: func (this *Type) or func (self Type)
pat='^[[:space:]]*func[[:space:]]+\([[:space:]]*(this|self)[[:space:]]'
if [[ "$line" =~ $pat ]]; then
local recv="${BASH_REMATCH[1]}"
add_violation "$file" "$line_num" "bad-receiver" "receiver named '$recv'; use a short 1-2 letter abbreviation of the type instead"
fi
done < "$file"
}
FILES=()
while IFS= read -r f; do
[[ -n "$f" ]] && FILES+=("$f")
done < <(find_go_files "$TARGET")
if [[ ${#FILES[@]} -eq 0 ]]; then
if $JSON_OUTPUT; then
echo '{"violations":[],"count":0,"status":"no_go_files"}'
else
echo "No Go files found in: $TARGET"
fi
exit 0
fi
for file in "${FILES[@]}"; do
check_screaming_constants "$file"
check_get_prefix "$file"
check_bad_package_names "$file"
check_bad_receivers "$file"
done
# Truncation
TOTAL=${#VIOLATIONS[@]}
TRUNCATED=false
if [[ $LIMIT -gt 0 && $TOTAL -gt $LIMIT ]]; then
VIOLATIONS=("${VIOLATIONS[@]:0:$LIMIT}")
TRUNCATED=true
fi
# Output results
if $JSON_OUTPUT; then
echo "{"
echo ' "violations": ['
first=true
for v in "${VIOLATIONS[@]+"${VIOLATIONS[@]}"}"; do
IFS='|' read -r location rule message <<< "$v"
file="${location%%:*}"
line="${location#*:}"
$first || echo ","
first=false
printf ' {"file":"%s","line":%s,"rule":"%s","message":"%s"}' \
"$(json_escape "$file")" "$line" "$(json_escape "$rule")" "$(json_escape "$message")"
done
echo ""
echo " ],"
printf ' "total": %d,\n' "$TOTAL"
printf ' "truncated": %s\n' "$TRUNCATED"
echo "}"
else
if [[ $TOTAL -eq 0 ]]; then
echo "No naming violations found."
exit 0
fi
echo "Naming violations found:"
echo ""
for v in "${VIOLATIONS[@]}"; do
IFS='|' read -r location rule message <<< "$v"
printf " %s [%s] %s\n" "$location" "$rule" "$message"
done
if $TRUNCATED; then
echo " ... and $((TOTAL - LIMIT)) more (use --limit to adjust)"
fi
echo ""
echo "Total: $TOTAL violation(s)"
fi
if [[ $TOTAL -gt 0 ]]; then
exit 1
fi
exit 0
Related skills
FAQ
What does go-naming scripts/check-naming.sh detect?
go-naming scripts/check-naming.sh scans Go code for SCREAMING_SNAKE_CASE constants, Get-prefixed getters, vague util or helper package names, and receiver naming anti-patterns aligned with Google and Uber guides.
Does go-naming cover Go package organization?
go-naming focuses on identifier naming for packages, types, functions, methods, variables, constants, and receivers; package organization belongs to the separate go-packages skill.
Is Go Naming safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.