<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>100 Mistakes in Golang on KKKZOZ&#39;s Blog</title>
    <link>http://blog.kkkzoz.top/series/100-mistakes-in-golang/</link>
    <description>Recent content in 100 Mistakes in Golang on KKKZOZ&#39;s Blog</description>
    <image>
      <title>KKKZOZ&#39;s Blog</title>
      <url>http://blog.kkkzoz.top/images/papermod-cover.png</url>
      <link>http://blog.kkkzoz.top/images/papermod-cover.png</link>
    </image>
    <generator>Hugo -- 0.147.0</generator>
    <language>en</language>
    <lastBuildDate>Tue, 11 Aug 2026 20:26:05 +0800</lastBuildDate>
    <atom:link href="http://blog.kkkzoz.top/series/100-mistakes-in-golang/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>[100 Mistakes in Golang 08-09] Chapter 8 &amp; 9</title>
      <link>http://blog.kkkzoz.top/posts/books/100-go-mistakes/chapter89/</link>
      <pubDate>Wed, 19 Mar 2025 00:00:00 +0000</pubDate>
      <guid>http://blog.kkkzoz.top/posts/books/100-go-mistakes/chapter89/</guid>
      <description>&lt;h2 id=&#34;55-mixing-up-concurrency-and-parallelism&#34;&gt;55: Mixing up concurrency and parallelism&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Concurrency enables parallelism&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Concurrency provides a structure to solve a problem with parts that may be parallelized.&lt;/li&gt;
&lt;/ul&gt;

            &lt;link rel=&#34;stylesheet&#34; href=&#34;http://blog.kkkzoz.top/css/vendors/admonitions.min.364ef4282de967778e4920f8ae18cc1b92b0c0b58b34b66fc17619dabfd48b6e.css&#34; integrity=&#34;sha256-Nk70KC3pZ3eOSSD4rhjMG5KwwLWLNLZvwXYZ2r/Ui24=&#34; crossorigin=&#34;anonymous&#34;&gt;
    &lt;div class=&#34;admonition quote&#34;&gt;
      &lt;div class=&#34;admonition-header&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 448 512&#34;&gt;&lt;path d=&#34;M448 296c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72zm-256 0c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72z&#34;/&gt;&lt;/svg&gt;
        &lt;span&gt;Quote&lt;/span&gt;
      &lt;/div&gt;
      &lt;div class=&#34;admonition-content&#34;&gt;
        &lt;p&gt;&amp;ldquo;Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once.&amp;rdquo;&lt;/p&gt;</description>
    </item>
    <item>
      <title>[100 Mistakes in Golang 07] Chapter 7</title>
      <link>http://blog.kkkzoz.top/posts/books/100-go-mistakes/chapter7/</link>
      <pubDate>Fri, 07 Mar 2025 00:00:00 +0000</pubDate>
      <guid>http://blog.kkkzoz.top/posts/books/100-go-mistakes/chapter7/</guid>
      <description>&lt;h2 id=&#34;48-panicking&#34;&gt;48: Panicking&lt;/h2&gt;
&lt;p&gt;Panicking in Go should be used sparingly. We have seen two prominent cases, one to signal a programmer error and another where our application fails to create a mandatory dependency.&lt;/p&gt;
&lt;h2 id=&#34;49-ignoring-when-to-wrap-an-error&#34;&gt;49: Ignoring when to wrap an error&lt;/h2&gt;
&lt;p&gt;In general, the two main use cases for error wrapping are the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Adding additional context to an error&lt;/li&gt;
&lt;li&gt;Marking an error as a specific error&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Errorf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;bar failed: %w&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This code wraps the source error to add additional context without having to create another error type.&lt;/p&gt;</description>
    </item>
    <item>
      <title>[100 Mistakes in Golang 06] Chapter 6</title>
      <link>http://blog.kkkzoz.top/posts/books/100-go-mistakes/chapter6/</link>
      <pubDate>Tue, 04 Mar 2025 00:00:00 +0000</pubDate>
      <guid>http://blog.kkkzoz.top/posts/books/100-go-mistakes/chapter6/</guid>
      <description>&lt;h2 id=&#34;42-not-knowing-which-type-of-receiver-to-use&#34;&gt;42: Not knowing which type of receiver to use&lt;/h2&gt;
&lt;p&gt;In Go, we can attach either a value or a pointer receiver to a method. With a value receiver, Go makes a copy of the value and passes it to the method. Any changes to the object remain local to the method. The original object remains unchanged.&lt;/p&gt;
&lt;p&gt;On the other hand, with a pointer receiver, Go passes the address of an object to the method. Intrinsically, it remains a copy, but we only copy a pointer, not the object itself (passing by reference doesn’t exist in Go). Any modifications to the receiver are done on the original object.&lt;/p&gt;</description>
    </item>
    <item>
      <title>[100 Mistakes in Golang 05] Chapter 5</title>
      <link>http://blog.kkkzoz.top/posts/books/100-go-mistakes/chapter5/</link>
      <pubDate>Mon, 03 Mar 2025 00:00:00 +0000</pubDate>
      <guid>http://blog.kkkzoz.top/posts/books/100-go-mistakes/chapter5/</guid>
      <description>&lt;h2 id=&#34;36-not-understanding-the-concept-of-a-rune&#34;&gt;36: Not understanding the concept of a rune&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;len&lt;/code&gt; built-in function applied on a string doesn’t return the number of characters; it returns the number of bytes.&lt;/p&gt;
&lt;p&gt;What if we want to get the number of runes in a string, not the number of bytes? How we can do this depends on the encoding.  In the previous example, because we assigned a string literal to s, we can use the &lt;code&gt;unicode/utf8&lt;/code&gt; package:&lt;/p&gt;</description>
    </item>
    <item>
      <title>[100 Mistakes in Golang 02] Chapter 2</title>
      <link>http://blog.kkkzoz.top/posts/books/100-go-mistakes/chapter2-code-and-project-organization/</link>
      <pubDate>Thu, 20 Feb 2025 00:00:00 +0000</pubDate>
      <guid>http://blog.kkkzoz.top/posts/books/100-go-mistakes/chapter2-code-and-project-organization/</guid>
      <description>&lt;!-- # Chapter 2 Code and Project Organization --&gt;
&lt;h2 id=&#34;2-unnecessary-nested-code&#34;&gt;2 Unnecessary nested code&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;能够提前返回的特殊判定就提前返回&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;xxx&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// ....&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// do X&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;总是能够写为&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;xxx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// do X&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Make expected execution flow clear&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&#34;2&#34; loading=&#34;lazy&#34; src=&#34;http://blog.kkkzoz.top/images/100-mistakes-2.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;5-interface-pollution&#34;&gt;5 Interface pollution&lt;/h2&gt;

            &lt;link rel=&#34;stylesheet&#34; href=&#34;http://blog.kkkzoz.top/css/vendors/admonitions.min.364ef4282de967778e4920f8ae18cc1b92b0c0b58b34b66fc17619dabfd48b6e.css&#34; integrity=&#34;sha256-Nk70KC3pZ3eOSSD4rhjMG5KwwLWLNLZvwXYZ2r/Ui24=&#34; crossorigin=&#34;anonymous&#34;&gt;
    &lt;div class=&#34;admonition quote&#34;&gt;
      &lt;div class=&#34;admonition-header&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 448 512&#34;&gt;&lt;path d=&#34;M448 296c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72zm-256 0c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72z&#34;/&gt;&lt;/svg&gt;
        &lt;span&gt;Quote&lt;/span&gt;
      &lt;/div&gt;
      &lt;div class=&#34;admonition-content&#34;&gt;
        &lt;p&gt;The bigger the interface, the weaker the abstraction.&lt;/p&gt;</description>
    </item>
    <item>
      <title>[100 Mistakes in Golang 03] Chapter 3</title>
      <link>http://blog.kkkzoz.top/posts/books/100-go-mistakes/chatpter3-data-types/</link>
      <pubDate>Thu, 20 Feb 2025 00:00:00 +0000</pubDate>
      <guid>http://blog.kkkzoz.top/posts/books/100-go-mistakes/chatpter3-data-types/</guid>
      <description>&lt;h2 id=&#34;17-creating-confusion-with-octal-literals&#34;&gt;17 Creating confusion with octal literals&lt;/h2&gt;
&lt;p&gt;In Go, an integer literal starting with 0 is considered an octal integer (base 8).&lt;/p&gt;
&lt;p&gt;Note the integer literal representations in Golang:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Binary - Uses a &lt;code&gt;0b&lt;/code&gt; or &lt;code&gt;0B&lt;/code&gt; prefix (for example, &lt;code&gt;0b100&lt;/code&gt; is equal to 4 in base 10)&lt;/li&gt;
&lt;li&gt;Octal - Uses a &lt;code&gt;0&lt;/code&gt; or &lt;code&gt;0o&lt;/code&gt; prefix (for example, &lt;code&gt;0o10&lt;/code&gt; is equal 8 in base 10)&lt;/li&gt;
&lt;li&gt;Hexadecimal - Uses an &lt;code&gt;0x&lt;/code&gt; or &lt;code&gt;0X&lt;/code&gt; prefix (for example, &lt;code&gt;0xF&lt;/code&gt; is equal to 15 in base 10)&lt;/li&gt;
&lt;li&gt;Imaginary - Uses an i suffix (for example, 3i)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;20-not-understanding-slice-length-and-capacity&#34;&gt;20 Not understanding slice length and capacity&lt;/h2&gt;
&lt;p&gt;In Go, a slice is backed by an array. That means the slice’s data is stored contiguously in an array data structure. A slice also handles the logic of adding an element if the backing array is full or shrinking the backing array if it’s almost empty.&lt;/p&gt;</description>
    </item>
    <item>
      <title>[100 Mistakes in Golang 04] Chapter 4</title>
      <link>http://blog.kkkzoz.top/posts/books/100-go-mistakes/chapter4-control-structures/</link>
      <pubDate>Thu, 20 Feb 2025 00:00:00 +0000</pubDate>
      <guid>http://blog.kkkzoz.top/posts/books/100-go-mistakes/chapter4-control-structures/</guid>
      <description>&lt;h2 id=&#34;30-ignoring-the-fact-that-elements-are-copied-in-range-loops&#34;&gt;30: Ignoring the fact that elements are copied in range loops&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;account&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;balance&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;float32&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;accounts&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;account&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;balance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;100.&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;balance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;200.&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;balance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;300.&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;range&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;accounts&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;balance&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1000&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// Output: [{100} {200} {300}]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In this example, the range loop does not affect the slice’s content.&lt;/p&gt;
&lt;p&gt;In Go, everything we assign is a copy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If we assign the result of a function returning a struct, it performs a copy of that struct.&lt;/li&gt;
&lt;li&gt;If we assign the result of a function returning a pointer, it performs a copy of the memory address (an address is 64 bits long on a 64-bit architecture).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Solutions:&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
