Pureline Go must remain idiomatic Go. Pureline does not try to make Go look like Java.
Error Guards
user, err := loadUser(id)
if err != nil {
return nil, err
}
session := createSession(user)
return session, nil This naturally matches Pureline's guard-first philosophy.
Avoid else After Terminating Branches
if err != nil {
return nil, err
} else {
return createSession(user), nil
} if err != nil {
return nil, err
}
return createSession(user), nil Naming Must Remain Idiomatic
user
session
conn
server
packet
request
ctx
err
wg
tx Avoid meaningless one-letter names unless they are strongly established local conventions.
Short Receiver Names Are Allowed
func (s *Server) Start() error {
} Receiver names are local, conventional, and unambiguous.
func (server *Server) Start() error {
} when it adds no clarity.
Small Interfaces
type Storage interface {
Load(id ID) (*User, error)
Save(user *User) error
} Avoid oversized interfaces containing unrelated responsibilities.
Define Interfaces Near Consumers
Interfaces should generally be defined where they are consumed rather than globally pre-designed as large inheritance-style abstractions.
Use defer for Clear Resource Lifecycles
file, err := os.Open(path)
if err != nil {
return err
}
defer file.Close() Goroutines Need Ownership
Avoid fire-and-forget goroutines without an explicit lifecycle.
A long-lived goroutine should have clear handling for cancellation, error propagation, shutdown, and ownership.
Avoid Premature Interface Abstraction
Do not create an interface merely because a concrete type might theoretically have another implementation later. Create abstractions when there is a real consumer need.