<?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: Just-maple</title>
    <description>The latest articles on DEV Community by Just-maple (@justmaple).</description>
    <link>https://dev.to/justmaple</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%2F1195047%2Fb30c6ce5-9287-408f-9a2f-352200475142.png</url>
      <title>DEV Community: Just-maple</title>
      <link>https://dev.to/justmaple</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/justmaple"/>
    <language>en</language>
    <item>
      <title>Use Gozz to Manage Your Golang Struct Field Tags Formats Automatically</title>
      <dc:creator>Just-maple</dc:creator>
      <pubDate>Fri, 27 Oct 2023 04:20:10 +0000</pubDate>
      <link>https://dev.to/justmaple/use-gozz-to-manage-your-golang-struct-field-tags-formats-automatically-256d</link>
      <guid>https://dev.to/justmaple/use-gozz-to-manage-your-golang-struct-field-tags-formats-automatically-256d</guid>
      <description>&lt;p&gt;In Go developing, we would design structs and fill their struct tag in many case. &lt;/p&gt;

&lt;p&gt;For example, &lt;code&gt;json:something&lt;/code&gt; for json marshal and unmarshal:&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="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;MyField&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"my_field"`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As we known, naming is a big problem in programing. When we fill these tag, we would face these questions as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which case should use, &lt;code&gt;camelCase&lt;/code&gt; or &lt;code&gt;snake_case&lt;/code&gt; ?&lt;/li&gt;
&lt;li&gt;If &lt;code&gt;camelCase&lt;/code&gt; used. how to format words like &lt;code&gt;UserID&lt;/code&gt; ? &lt;code&gt;userId&lt;/code&gt; or &lt;code&gt;userID&lt;/code&gt; ?&lt;/li&gt;
&lt;li&gt;Struct fields could be added and their name could be modified also. How to quickly updated these field tag as format your desired, and may be there would be many tag to update.&lt;/li&gt;
&lt;li&gt;If project would be cooperated with peoples. How to ensure every members would follow these convention, and never need to remind these rules again and again.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even we could design lint tool to validate these tag is whether desired in our pipeline, but I believe that : The best way to manage these struct fields tags is never manage it in manually, but in instrumentally.&lt;/p&gt;

&lt;p&gt;You could try &lt;code&gt;Gozz&lt;/code&gt; to do this more simply:&lt;/p&gt;

&lt;p&gt;Here is a normal case, we want to add &lt;code&gt;json&lt;/code&gt; and &lt;code&gt;bson&lt;/code&gt; tag for our struct.&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="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;tag01&lt;/span&gt;

&lt;span class="c"&gt;// +zz:tag:json,bson:{{ snake .FieldName }}&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Id&lt;/span&gt;        &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="n"&gt;Name&lt;/span&gt;      &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="n"&gt;Address&lt;/span&gt;   &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="n"&gt;CreatedAt&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt;
    &lt;span class="n"&gt;UpdatedAt&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;add the annotation on struct : &lt;code&gt;+zz:tag:json,bson:{{ snake .FieldName}}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;and then execute &lt;code&gt;gozz run -p "tag" ./&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;You would find out these stuff is solved and nobody would be troubled anymore.&lt;br&gt;
&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="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;tag01&lt;/span&gt;

&lt;span class="c"&gt;// +zz:tag:json,bson:{{ snake .FieldName }}&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Id&lt;/span&gt;        &lt;span class="kt"&gt;string&lt;/span&gt;    &lt;span class="s"&gt;`bson:"id" json:"id"`&lt;/span&gt;
    &lt;span class="n"&gt;Name&lt;/span&gt;      &lt;span class="kt"&gt;string&lt;/span&gt;    &lt;span class="s"&gt;`bson:"name" json:"name"`&lt;/span&gt;
    &lt;span class="n"&gt;Address&lt;/span&gt;   &lt;span class="kt"&gt;string&lt;/span&gt;    &lt;span class="s"&gt;`bson:"address" json:"address"`&lt;/span&gt;
    &lt;span class="n"&gt;CreatedAt&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt; &lt;span class="s"&gt;`bson:"created_at" json:"created_at"`&lt;/span&gt;
    &lt;span class="n"&gt;UpdatedAt&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt; &lt;span class="s"&gt;`bson:"updated_at" json:"updated_at"`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Just put these script in project’s makefile and execute them in projects’s build pipeline or commit hooks. Time Is Saved.&lt;/p&gt;

&lt;p&gt;The upper example show what is the basic usage of &lt;code&gt;gozz-tag&lt;/code&gt;, this example would show how it strong could be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It placed the annotation both on block declaration ,struct declaration, and also struct field.&lt;/li&gt;
&lt;li&gt;And it use different cases and pipeline method in &lt;code&gt;go-template&lt;/code&gt;

 &lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// +zz:tag:json,bson:{{ snake .FieldName }}&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Id&lt;/span&gt;        &lt;span class="kt"&gt;string&lt;/span&gt;
        &lt;span class="n"&gt;Name&lt;/span&gt;      &lt;span class="kt"&gt;string&lt;/span&gt;
        &lt;span class="n"&gt;Address&lt;/span&gt;   &lt;span class="kt"&gt;string&lt;/span&gt;
        &lt;span class="n"&gt;CreatedAt&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt;
        &lt;span class="n"&gt;UpdatedAt&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// +zz:tag:json,bson:{{ camel .FieldName }}&lt;/span&gt;
    &lt;span class="n"&gt;Book&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Id&lt;/span&gt;        &lt;span class="kt"&gt;string&lt;/span&gt;
        &lt;span class="n"&gt;Title&lt;/span&gt;     &lt;span class="kt"&gt;string&lt;/span&gt;
        &lt;span class="n"&gt;CreatedAt&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt;
        &lt;span class="n"&gt;UpdatedAt&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;Order&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Id&lt;/span&gt;     &lt;span class="kt"&gt;string&lt;/span&gt;
        &lt;span class="n"&gt;UserId&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
        &lt;span class="n"&gt;BookId&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
        &lt;span class="c"&gt;// +zz:tag:json,bson:{{ upper .FieldName | upper }}&lt;/span&gt;
        &lt;span class="n"&gt;CreatedAt&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt;
        &lt;span class="c"&gt;// +zz:tag:+json:,omitempty&lt;/span&gt;
        &lt;span class="n"&gt;UpdatedAt&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Execute &lt;code&gt;gozz&lt;/code&gt; again and see what is happened:&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;// +zz:tag:json,bson:{{ snake .FieldName }}&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Id&lt;/span&gt;        &lt;span class="kt"&gt;string&lt;/span&gt;    &lt;span class="s"&gt;`bson:"id" json:"id"`&lt;/span&gt;
        &lt;span class="n"&gt;Name&lt;/span&gt;      &lt;span class="kt"&gt;string&lt;/span&gt;    &lt;span class="s"&gt;`bson:"name" json:"name"`&lt;/span&gt;
        &lt;span class="n"&gt;Address&lt;/span&gt;   &lt;span class="kt"&gt;string&lt;/span&gt;    &lt;span class="s"&gt;`bson:"address" json:"address"`&lt;/span&gt;
        &lt;span class="n"&gt;CreatedAt&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt; &lt;span class="s"&gt;`bson:"created_at" json:"created_at"`&lt;/span&gt;
        &lt;span class="n"&gt;UpdatedAt&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt; &lt;span class="s"&gt;`bson:"updated_at" json:"updated_at"`&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// +zz:tag:json,bson:{{ camel .FieldName }}&lt;/span&gt;
    &lt;span class="n"&gt;Book&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Id&lt;/span&gt;        &lt;span class="kt"&gt;string&lt;/span&gt;    &lt;span class="s"&gt;`bson:"id" json:"id"`&lt;/span&gt;
        &lt;span class="n"&gt;Title&lt;/span&gt;     &lt;span class="kt"&gt;string&lt;/span&gt;    &lt;span class="s"&gt;`bson:"title" json:"title"`&lt;/span&gt;
        &lt;span class="n"&gt;CreatedAt&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt; &lt;span class="s"&gt;`bson:"createdAt" json:"createdAt"`&lt;/span&gt;
        &lt;span class="n"&gt;UpdatedAt&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt; &lt;span class="s"&gt;`bson:"updatedAt" json:"updatedAt"`&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;Order&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Id&lt;/span&gt;     &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`bson:"id" json:"id"`&lt;/span&gt;
        &lt;span class="n"&gt;UserId&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`bson:"user_id" json:"user_id"`&lt;/span&gt;
        &lt;span class="n"&gt;BookId&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`bson:"book_id" json:"book_id"`&lt;/span&gt;
        &lt;span class="c"&gt;// +zz:tag:json,bson:{{ snake .FieldName | upper }}&lt;/span&gt;
        &lt;span class="n"&gt;CreatedAt&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt; &lt;span class="s"&gt;`bson:"CREATED_AT" json:"CREATED_AT"`&lt;/span&gt;
        &lt;span class="c"&gt;// +zz:tag:+json:,omitempty&lt;/span&gt;
        &lt;span class="n"&gt;UpdatedAt&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt; &lt;span class="s"&gt;`bson:"updated_at" json:"updated_at,omitempty"`&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every different needs was solved.&lt;/p&gt;

&lt;p&gt;Some I believe that, with the help of &lt;code&gt;Gozz&lt;/code&gt; , we do not need to manage every struct fields in coding , just put them to &lt;code&gt;Gozz&lt;/code&gt; and pipeline.&lt;/p&gt;

&lt;p&gt;Actually, this function is just one of the builtin plugins of &lt;code&gt;Gozz&lt;/code&gt; , it provides many other more awesome plugins to help us improve developing with the help of annotations, such as autowired , api routing , orm structure generation .&lt;/p&gt;

&lt;p&gt;Just &lt;a href="https://github.com/go-zing/gozz"&gt;checkout to github&lt;/a&gt; and &lt;a href="https://go-zing.github.io/gozz/"&gt;documentation&lt;/a&gt; , and it’s welcome to give us a star .&lt;/p&gt;

</description>
      <category>go</category>
      <category>backend</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
