Skip to content
Santekno.com | Tech Tutorials and Trends
EN
📖 0%
13 Sep 2025 · 6 min read ·Article 75 / 125
Go

75 Documenting Resolvers with Go Comments

IH
Ihsan Arif
Writer at Santekno · Backend Engineer

75 Documenting Resolvers with Go Comments

Have you ever, as a software engineer, felt frustrated reading legacy code that lacked proper documentation? Or maybe during a team code review, you stumbled upon a “magical” resolver with no explanation whatsoever in its comments? Did you know that good documentation not only makes code easier to maintain, but also greatly helps other developers understand your intent, logic, and the assumptions you made while writing the code—even lowering the onboarding cost for new team members?

In this article, I want to discuss the importance of documenting resolvers with idiomatic comments in Go (Golang). We’ll cover best practices, code examples, and a small simulation of the impact of documented code. At the end of the article, you’ll also find a checklist table and an example flow diagram using Mermaid to make the documentation clearer.


Why Focus on Resolvers?

Resolvers are an important part of several application architectures, such as in GraphQL, dependency injection within domain-driven design, and proxies in RPC. A resolver’s job is to “resolve”—to parse, translate, and bridge between a request and a data or service provider.

Because they often serve as both the entry point and the bridging logic, resolvers frequently hold complex logic. If left undocumented, the following problems often arise:

  • Ambiguity: Reviewers/colleagues don’t understand the design decisions.
  • Debugging: It’s hard to trace the flow when bugs occur.
  • Spec Regeneration: Authentic documentation helps automatically regenerate specifications/API docs.

“Idiomatic Comments”: The Documentation Standard in Go

Go has a philosophy that “comments are not a substitute for bad code”, but rather reinforce good code. Go documentation usually sits directly above a function, struct, or interface declaration, using concise yet informative single-line comments (//). Thanks to tools like GoDoc , these comments can be rendered into HTML documentation automatically.

Common Go Documentation Pattern:

go
1// NameFunc describes what this function does.
2func NameFunc(args) ReturnType {...}


Case Study: A Resolver in a Go Service

Imagine you’re building a GraphQL API with the following resolver:

go
1func (r *queryResolver) User(ctx context.Context, id string) (*User, error) {
2    user, err := r.userRepo.FindByID(ctx, id)
3    if err != nil {
4        return nil, err
5    }
6    return user, nil
7}

The code above is implicitly easy to read, but are there any edge cases other developers should be aware of? What happens if userRepo is nil? What errors might be returned?

Let’s document this function idiomatically:

go
 1// User returns the User data matching the given ID.
 2//
 3// If not found, it returns an error of type ErrNotFound.
 4// If an internal problem occurs in the repository, it returns a repository-related error.
 5//
 6// Parameters:
 7//   - ctx: The request context sent by the client, used for tracing and cancelation.
 8//   - id: A unique string serving as the User identifier.
 9//
10// Return:
11//   - *User: The User object, if found.
12//   - error: Nil on success, otherwise an error detailing the problem that occurred.
13func (r *queryResolver) User(ctx context.Context, id string) (*User, error) {
14    user, err := r.userRepo.FindByID(ctx, id)
15    if err != nil {
16        if errors.Is(err, repository.ErrNotFound) {
17            return nil, fmt.Errorf("user %s not found: %w", id, err)
18        }
19        return nil, fmt.Errorf("failed to fetch user %s: %w", id, err)
20    }
21    return user, nil
22}

The comment above clarifies:

  • Description: What this function does.
  • Parameters: An explanation of the args, sometimes including their data types.
  • Return: A description of the return values.
  • Error Handling: The possible errors that may occur.

Simulation: Code With and Without Comments

1. A new developer “onboarding” without comments

Danger
“I need to change how the User function fetches user data. Hmm… oh, it turns out this depends on the repo struct. But what happens if it’s not found? What’s the error format?”

2. With idiomatic Go comments

Danger
“Okay, it turns out the error comes back as ErrNotFound, so the handling is already there. Oh, and this repo can return internal errors too.”

Onboarding time for new team members can be reduced by 30-50% simply because of clear documentation in the resolvers.


Mermaid Diagram: Resolver Flow

To make the documentation clearer, add a simple flow diagram to the README or GoDoc. Here’s an example using Mermaid :

MERMAID
flowchart TD
    A[Client Request] --> B[Resolver User]
    B -->|Success| C[Fetch by ID from Repo]
    C -->|User Found| D[Return *User, nil]
    C -->|User Not Found| E[Return nil, ErrNotFound]
    C -->|Internal Error| F[Return nil, RepoError]

A diagram like this helps developers understand a function’s execution path, especially for resolvers that pass through many conditions.


Best Practice: Resolver Comments in Go

Documentation Checklist Table

AspectRequired in Comments?Notes
Brief Description✔️What the resolver does
Parameters & Types✔️Explanation of arguments, especially the context and important inputs
Return Values✔️Description of the return values, including error types
Error Handling✔️Explain specific errors, e.g. “returns ErrNotFound if the id doesn’t exist”
External ReferencesOptionalIf you use external APIs, repos, etc., link to references or RFCs
Usage ExampleOptionalAdd to important/abstract functions, but not required for every resolver

Tips for Writing Effective Resolver Comments

  1. Use the GoDoc format
    Always begin the comment with the function/struct name (for GoDoc parsing).
    go
    1// User returns the User data based on the ID.
  2. Write consistently in Indonesian/English
    Usually use English, unless the entire team uses Indonesian.
  3. Explain edge cases & preconditions
    What assumptions are being made? Does the context have to be active? Can nil parameters be accepted?
  4. Don’t copy-paste the function signature
    Focus on the why, what, and when, not how to use the syntax.
  5. Reference errors from other packages
    Resolvers often return errors from dependencies. Mention those errors to make debugging easier.

Conclusion

Documenting resolvers with idiomatic Go comments is one of the cheapest investments with a huge impact on code maintainability. With good documentation, especially in the resolver layer, other engineers can quickly grasp the big picture, reduce the guessing game during debugging, and smooth out the onboarding process. Combine Go comments, tables, and flow diagrams to make your code self-documented.

Remember:
“Good code is usable. Code with good documentation becomes a legacy for your team.” – A wise engineer


A challenge for you: Review one of your favorite resolvers, then add the clearest idiomatic Go comments you can. Share the improvement with your teammates—and feel the positive impact!


References:

Related Articles

💬 Comments