<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: WonJeong Kim</title>
    <description>The latest articles on DEV Community by WonJeong Kim (@narubrown).</description>
    <link>https://dev.to/narubrown</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3703261%2F092a6d36-ceba-4724-a009-9825c04be26f.JPG</url>
      <title>DEV Community: WonJeong Kim</title>
      <link>https://dev.to/narubrown</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/narubrown"/>
    <language>en</language>
    <item>
      <title>I got tired of memorizing swaggo comment order, so I made this</title>
      <dc:creator>WonJeong Kim</dc:creator>
      <pubDate>Fri, 09 Jan 2026 22:42:27 +0000</pubDate>
      <link>https://dev.to/narubrown/i-got-tired-of-memorizing-swaggo-comment-order-so-i-made-this-2gd0</link>
      <guid>https://dev.to/narubrown/i-got-tired-of-memorizing-swaggo-comment-order-so-i-made-this-2gd0</guid>
      <description>&lt;p&gt;So I've been using swaggo for documenting Go APIs and honestly it works great, but...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// @Param id query string true "User ID"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every single time I write this I have to stop and think "wait which one comes first again?"&lt;/p&gt;

&lt;p&gt;And I know I'm not the only one because our team slack has like 10 messages asking "what's the order for &lt;a class="mentioned-user" href="https://dev.to/param"&gt;@param&lt;/a&gt; again?"&lt;/p&gt;

&lt;h2&gt;
  
  
  What annoyed me
&lt;/h2&gt;

&lt;p&gt;The main thing is you have to memorize the position of every argument. Like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// @Param id query string true "description"&lt;/span&gt;
&lt;span class="c"&gt;//        ┬   ┬     ┬      ┬    ┬&lt;/span&gt;
&lt;span class="c"&gt;//        name in  type  required description&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And honestly I still mix up type and required sometimes.&lt;/p&gt;

&lt;p&gt;Also when you typo a struct name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// @Success 200 {object} dto.UserReponse "OK"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The swag CLI doesn't catch it until runtime. Super annoying.&lt;/p&gt;

&lt;p&gt;Plus onboarding new devs is always the same conversation - "just remember the order is name, in, type, required, description" and they're like "ok but which order though"&lt;/p&gt;

&lt;h2&gt;
  
  
  So I made an extension
&lt;/h2&gt;

&lt;p&gt;Basically you can write it like this instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="no"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;desc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"User ID"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Success&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;schema&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UserResponse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;desc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Success"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It converts to normal swaggo comments as you type. So the file still has the regular &lt;code&gt;// @Param&lt;/code&gt; stuff but in the editor you see and edit the named parameter version.&lt;/p&gt;

&lt;p&gt;The nice thing is you don't have to remember any order. Just type the keys you want.&lt;/p&gt;

&lt;p&gt;Here's what it looks like in practice:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Summary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Create classroom"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Tags&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"classroom"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"admin"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"body"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"body"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateClassroomRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="no"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;desc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Classroom creation request"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Success&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;schema&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClassroomResponse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;desc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Success"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/classrooms"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"post"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;CreateClassroom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;echo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// your code&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// @Summary Create classroom&lt;/span&gt;
&lt;span class="c"&gt;// @Tags classroom,admin&lt;/span&gt;
&lt;span class="c"&gt;// @Param body body dto.CreateClassroomRequest true "Classroom creation request"&lt;/span&gt;
&lt;span class="c"&gt;// @Success 200 {object} dto.ClassroomResponse "Success"&lt;/span&gt;
&lt;span class="c"&gt;// @Router /classrooms [post]&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;CreateClassroom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;echo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// your code&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But you only edit the first version.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Named parameters so you don't have to remember order&lt;/li&gt;
&lt;li&gt;IDE autocomplete for annotation names and your Go types&lt;/li&gt;
&lt;li&gt;Hover over it to see what the actual swaggo comment looks like&lt;/li&gt;
&lt;li&gt;Has snippets for common patterns&lt;/li&gt;
&lt;li&gt;Converts in real-time as you type&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Basically makes it way easier to write and read swagger docs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvvhoxbj1rhm9qsoza2gt.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvvhoxbj1rhm9qsoza2gt.gif" alt="annotation_feature_demo" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fas1m14i9ibjxuse7ws50.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fas1m14i9ibjxuse7ws50.gif" alt="annotation_edit" width="800" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnfw8hbc6o3e6efldv6kr.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnfw8hbc6o3e6efldv6kr.gif" alt="hover_result_preview" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can see it converting as you type and the hover shows you the result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I made this
&lt;/h2&gt;

&lt;p&gt;We have like 20+ API endpoints on our team and maintaining the swagger docs was getting annoying. After using this for a few months:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New team members stopped asking about syntax&lt;/li&gt;
&lt;li&gt;Less mistakes in code reviews&lt;/li&gt;
&lt;li&gt;Easier to refactor because IDE can actually help validate the types&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's not perfect but it's been useful for us.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's supported
&lt;/h2&gt;

&lt;p&gt;Pretty much all the common swaggo tags - Summary, Description, Tags, Param, Success, Failure, Router, etc.&lt;/p&gt;

&lt;p&gt;You can use named parameters for most of them or just use the old positional style if you want.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing
&lt;/h2&gt;

&lt;p&gt;Just search "Swaggo" in VS Code extensions and install it.&lt;/p&gt;

&lt;p&gt;Or get it from the marketplace: &lt;a href="https://marketplace.visualstudio.com/items?itemName=narubrown.swaggo" rel="noopener noreferrer"&gt;https://marketplace.visualstudio.com/items?itemName=narubrown.swaggo&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;It doesn't actually check if the types exist in your code - that's still swag CLI's job. This just makes writing the comments easier.&lt;/p&gt;

&lt;p&gt;Also it's VS Code only right now. Maybe I'll make it for other editors later if people want it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;It's free.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/NARUBROWN/swaggo" rel="noopener noreferrer"&gt;https://github.com/NARUBROWN/swaggo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Would be cool to hear if this is actually useful or if I'm just weird for being annoyed by positional arguments lol&lt;/p&gt;

&lt;p&gt;If you have ideas for improvements feel free to open an issue.&lt;/p&gt;




&lt;p&gt;PS: This doesn't change Go at all, it's just editor sugar that outputs regular swaggo comments. Your code stays 100% compatible with everything.&lt;/p&gt;

</description>
      <category>go</category>
      <category>vscode</category>
      <category>swagger</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
