<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Golang on Nalar</title>
    <link>https://nalar.dev/id/tags/golang/</link>
    <description>Recent content in Golang on Nalar</description>
    <generator>Hugo</generator>
    <language>id-id</language>
    <lastBuildDate>Sat, 19 Sep 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://nalar.dev/id/tags/golang/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>OTP Email di Go: Kode Sekali Pakai, Kedaluwarsa, dan Perlindungan Replay</title>
      <link>https://nalar.dev/id/otp-email-di-go-kode-sekali-pakai-kedaluwarsa-dan-perlindungan-replay/</link>
      <pubDate>Sat, 19 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/otp-email-di-go-kode-sekali-pakai-kedaluwarsa-dan-perlindungan-replay/</guid>
      <description>&lt;h1 id=&#34;otp-email-di-go-kode-sekali-pakai-kedaluwarsa-dan-perlindungan-replay&#34;&gt;OTP Email di Go: Kode Sekali Pakai, Kedaluwarsa, dan Perlindungan Replay&lt;/h1&gt;&#xA;&lt;p&gt;OTP email terlihat sederhana: buat enam digit, kirimkan, lalu bandingkan dengan input pengguna. Namun, batas keamanannya bukan berada pada API email. Bagian pentingnya adalah lifecycle challenge di sisi server.&lt;/p&gt;&#xA;&lt;p&gt;Implementasi yang benar harus membuat kode sulit ditebak, membatasi masa berlakunya, membatasi tebakan, menonaktifkan challenge lama ketika diperlukan, dan memastikan kode yang sudah berhasil dipakai tidak dapat dikonsumsi untuk kedua kalinya. Properti ini berbeda dari TOTP, meskipun keduanya sering disebut OTP.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Go Defer Menyimpan Argumen Pemanggilan Sebelum Return</title>
      <link>https://nalar.dev/id/go-defer-menyimpan-argumen-pemanggilan-sebelum-return/</link>
      <pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/go-defer-menyimpan-argumen-pemanggilan-sebelum-return/</guid>
      <description>&lt;p&gt;Statement &lt;code&gt;defer&lt;/code&gt; pada Go mengevaluasi nilai fungsi dan parameter pemanggilannya ketika eksekusi mencapai statement tersebut, meskipun fungsi yang ditunda baru berjalan saat fungsi di sekitarnya melakukan return. Mutasi di antara dua momen itu tidak mengubah secara retroaktif nilai argumen yang sudah disimpan.&lt;/p&gt;&#xA;&lt;p&gt;Pemisahan antara evaluasi dan invocation ini merupakan bagian dari semantik bahasa, bukan detail optimisasi. Setiap &lt;code&gt;defer&lt;/code&gt; yang dieksekusi mencatat sebuah pemanggilan dengan nilai yang ditetapkan pada saat itu. Proses return kemudian menjalankan pemanggilan yang tercatat dalam urutan registrasi terbalik.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Go errgroup SetLimit Memblokir Submitter saat Batas Concurrency Tercapai</title>
      <link>https://nalar.dev/id/go-errgroup-setlimit-memblokir-submitter-saat-batas-concurrency-tercapai/</link>
      <pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/go-errgroup-setlimit-memblokir-submitter-saat-batas-concurrency-tercapai/</guid>
      <description>&lt;p&gt;&lt;code&gt;errgroup.Group.SetLimit&lt;/code&gt; dapat memblokir goroutine yang memanggil &lt;code&gt;Group.Go&lt;/code&gt;. Limit diterapkan sebelum worker goroutine baru dimulai, sehingga group yang penuh menerapkan backpressure pada saat task submission alih-alih membangun internal queue.&lt;/p&gt;&#xA;&lt;p&gt;Perilaku ini penting ketika submission merupakan bagian dari control path lain. Loop yang tampak meluncurkan pekerjaan secara asynchronous dapat berhenti di &lt;code&gt;g.Go(...)&lt;/code&gt; sampai salah satu active function selesai.&lt;/p&gt;&#xA;&lt;h2 id=&#34;limit-berada-pada-admission&#34;&gt;Limit berada pada admission&lt;/h2&gt;&#xA;&lt;p&gt;Zero-value &lt;code&gt;errgroup.Group&lt;/code&gt; tidak memiliki concurrency limit. Setelah &lt;code&gt;SetLimit(n)&lt;/code&gt;, paling banyak &lt;code&gt;n&lt;/code&gt; function yang dimulai oleh &lt;code&gt;Go&lt;/code&gt; aktif secara bersamaan. Negative limit mengembalikan unlimited admission, sedangkan zero limit mencegah setiap pemanggilan &lt;code&gt;Go&lt;/code&gt; berikutnya memulai function.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Go singleflight Hanya Membagikan Hasil yang Sedang In-Flight</title>
      <link>https://nalar.dev/id/go-singleflight-hanya-membagikan-hasil-yang-sedang-in-flight/</link>
      <pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/go-singleflight-hanya-membagikan-hasil-yang-sedang-in-flight/</guid>
      <description>&lt;p&gt;&lt;code&gt;singleflight.Group&lt;/code&gt; menekan eksekusi function duplikat hanya selama operasi dengan key yang sama masih in-flight. Caller concurrent dapat menerima satu hasil bersama, tetapi caller yang datang setelah completion akan memulai eksekusi baru. Karena itu group adalah mekanisme request coalescing, bukan result cache.&lt;/p&gt;&#xA;&lt;p&gt;Boundary ini memengaruhi cache fill, metadata refresh, backend read, dan operasi berbasis key lain yang dapat menerima burst pekerjaan concurrent identik. Group dapat mengurangi tekanan simultan pada backing operation tanpa memperpanjang lifetime value yang dikembalikan.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Go sync.Cond Wait Memeriksa Ulang Shared State</title>
      <link>https://nalar.dev/id/go-sync-cond-wait-memeriksa-ulang-shared-state/</link>
      <pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/go-sync-cond-wait-memeriksa-ulang-shared-state/</guid>
      <description>&lt;p&gt;&lt;code&gt;sync.Cond.Wait&lt;/code&gt; melanjutkan eksekusi setelah notification, tetapi notification tidak menyatakan bahwa kondisi khusus milik caller masih true ketika goroutine memperoleh lock kembali. Shared predicate tetap menjadi source of truth, sehingga waiter memeriksanya lagi setiap kali &lt;code&gt;Wait&lt;/code&gt; kembali.&lt;/p&gt;&#xA;&lt;p&gt;Boundary ini memisahkan notification dari state. &lt;code&gt;Signal&lt;/code&gt; dan &lt;code&gt;Broadcast&lt;/code&gt; mengumumkan bahwa state yang relevan mungkin telah berubah; keduanya tidak memindahkan ownership state tersebut atau memesannya untuk waiter tertentu.&lt;/p&gt;&#xA;&lt;h2 id=&#34;wait-membuka-lock-lalu-memperolehnya-kembali&#34;&gt;Wait membuka lock lalu memperolehnya kembali&lt;/h2&gt;&#xA;&lt;p&gt;Sebuah &lt;code&gt;Cond&lt;/code&gt; terkait dengan &lt;code&gt;Locker&lt;/code&gt;, umumnya &lt;code&gt;*sync.Mutex&lt;/code&gt;. Caller memegang lock tersebut saat memeriksa shared state. Jika predicate false, &lt;code&gt;Wait&lt;/code&gt; secara atomik membuka locker dan menangguhkan caller. Sebelum &lt;code&gt;Wait&lt;/code&gt; kembali, ia mengunci locker lagi.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Reuse Go WaitGroup Memerlukan Boundary Wait yang Sudah Selesai</title>
      <link>https://nalar.dev/id/reuse-go-waitgroup-memerlukan-boundary-wait-yang-sudah-selesai/</link>
      <pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/reuse-go-waitgroup-memerlukan-boundary-wait-yang-sudah-selesai/</guid>
      <description>&lt;p&gt;&lt;code&gt;sync.WaitGroup&lt;/code&gt; dapat digunakan kembali setelah sebuah wait phase selesai, tetapi task set independen baru tidak boleh dimulai selama call &lt;code&gt;Wait&lt;/code&gt; dari phase sebelumnya masih aktif. Boundary-nya adalah return dari setiap &lt;code&gt;Wait&lt;/code&gt; sebelumnya, bukan sekadar saat internal task counter mencapai nol.&lt;/p&gt;&#xA;&lt;p&gt;Constraint ini penting ketika satu instance &lt;code&gt;WaitGroup&lt;/code&gt; dipertahankan lintas batch, epoch, request wave, atau coordination cycle berulang. Reuse didukung, tetapi phase tidak boleh overlap pada transisi counter dari nol menjadi positif.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Urutan Iterasi Map Go Tidak Stabil</title>
      <link>https://nalar.dev/id/urutan-iterasi-map-go-tidak-stabil/</link>
      <pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/urutan-iterasi-map-go-tidak-stabil/</guid>
      <description>&lt;p&gt;&lt;code&gt;range&lt;/code&gt; pada map Go dapat mengunjungi entri yang sama dalam urutan berbeda pada iterasi berturut-turut. Spesifikasi bahasa menyatakan bahwa urutan iterasi map tidak ditentukan dan tidak menjamin bahwa iterasi berikutnya pada map yang tidak berubah akan mengulangi urutan sebelumnya.&lt;/p&gt;&#xA;&lt;p&gt;Kontrak ini lebih kuat daripada sekadar mengatakan bahwa map tidak terurut. Container yang tidak terurut masih bisa saja menampilkan urutan stabil yang bergantung pada insertion order atau layout storage. Program Go tidak boleh memberikan makna seperti itu pada traversal map.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
