<?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>Golang on omegaatt</title>
    <link>https://www.omegaatt.com/tags/golang/</link>
    <description>Recent content in Golang on omegaatt</description>
    <generator>Hugo -- 0.164.0</generator>
    <language>zh-TW</language>
    <copyright>Raiven Kao 2020 - 2026</copyright>
    <lastBuildDate>Sat, 07 Nov 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://www.omegaatt.com/tags/golang/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>連 RSS 聚合都懶的看了，請直接塞到我臉上</title>
      <link>https://www.omegaatt.com/blogs/develop/2026/karakeep_tg_bot/</link>
      <pubDate>Sat, 07 Nov 2026 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2026/karakeep_tg_bot/</guid>
      <description>串接 Karakeep 與 Telegram bot 並發送消息到 Telegram channel</description>
    </item>
    <item>
      <title>Unrounded Scaling：Go 1.27 浮點數轉換演算法的深度拆解</title>
      <link>https://www.omegaatt.com/blogs/develop/2026/golang_unrounded_scaling/</link>
      <pubDate>Wed, 26 Aug 2026 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2026/golang_unrounded_scaling/</guid>
      <description>拆解 Go 浮點數列印與解析的 unrounded scaling 演算法，從整數運算、正確性到效能測試，理解 strconv 背後的實作。</description>
    </item>
    <item>
      <title>Spec-First API：用 codegen 約束 LLM 與人類的 drift</title>
      <link>https://www.omegaatt.com/blogs/develop/2026/spec_first_api_against_drift/</link>
      <pubDate>Tue, 11 Aug 2026 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2026/spec_first_api_against_drift/</guid>
      <description>記錄 Go 服務從 code-first 遷移到 spec-first 的過程，用 OpenAPI、oapi-codegen 與 CI 降低路由、文件與實作之間的落差。</description>
    </item>
    <item>
      <title>Golang 1.27 新特性整理：泛型補完與轉正的實驗性功能</title>
      <link>https://www.omegaatt.com/blogs/develop/2026/golang_1_27_new_features/</link>
      <pubDate>Thu, 06 Aug 2026 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2026/golang_1_27_new_features/</guid>
      <description>依 Go 1.27 release candidate 整理泛型與實驗功能的變動，搭配程式碼範例記錄升級時值得留意的地方。</description>
    </item>
    <item>
      <title>Go 1.27 即將支援 Generic Method：告別 package-level 函式的 workaround</title>
      <link>https://www.omegaatt.com/blogs/develop/2026/golang_generic_method/</link>
      <pubDate>Wed, 27 May 2026 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2026/golang_generic_method/</guid>
      <description>從 Go 泛型方法的限制談起，整理 interface dispatch 的取捨、package-level workaround 與 generic method 提案的進展。</description>
    </item>
    <item>
      <title>Pragmatic Clean Architecture in Go</title>
      <link>https://www.omegaatt.com/blogs/develop/2026/pragmatic_clean_architecture_in_go/</link>
      <pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2026/pragmatic_clean_architecture_in_go/</guid>
      <description>Go 專案該保留哪些分層、捨棄哪些抽象？從實務取捨出發，整理適合中小型專案的 Clean Architecture。</description>
    </item>
    <item>
      <title>放棄 Electron 與 Tauri? 我用 Wails &#43; HTMX 打造 3MB 的跨平台桌面應用</title>
      <link>https://www.omegaatt.com/blogs/develop/2026/golang_desktop_application_with_wails_and_htmx/</link>
      <pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2026/golang_desktop_application_with_wails_and_htmx/</guid>
      <description>用 Go、Wails、HTMX 與 Templ 製作批次重新命名工具，記錄跨平台桌面應用的技術選擇、開發與打包經驗。</description>
    </item>
    <item>
      <title>Clean Craftsmanship：在 LLM 時代重拾軟體工匠精神</title>
      <link>https://www.omegaatt.com/blogs/develop/2026/clean_craftsmanship/</link>
      <pubDate>Thu, 19 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2026/clean_craftsmanship/</guid>
      <description>&lt;h2 id=&#34;為什麼在這個時間點讀這本書&#34;&gt;為什麼在這個時間點讀這本書&lt;/h2&gt;
&lt;p&gt;最近對於如何在 LLM 時代帶領團隊一起提昇生產力感到困惑。當 AI 能在幾秒鐘內生成幾百行程式碼，「寫程式」這件事的門檻似乎降到了前所未有的低點。但門檻低了，品質呢？&lt;/p&gt;</description>
    </item>
    <item>
      <title>Golang 1.25 testing/synctest 初體驗：告別在測試中寫 time.Sleep 的日子</title>
      <link>https://www.omegaatt.com/blogs/develop/2026/golang_synctest/</link>
      <pubDate>Sun, 18 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2026/golang_synctest/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;在我們目前的應用程式架構中，由於高度與 Kubernetes 耦合，服務啟動與運作期間需要頻繁地去讀取 K8s 中的 ConfigMap。為了達成配置熱更新（Hot Reload），我們引入了 Kubernetes client-go 中的 &lt;a href=&#34;https://pkg.go.dev/k8s.io/client-go/informers&#34;&gt;informers&lt;/a&gt; 機制來監聽 ConfigMap 的 CRUD 事件。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Golang 1.26 新特性在數量上史無前例的多</title>
      <link>https://www.omegaatt.com/blogs/develop/2026/golang_1_26_huge_features/</link>
      <pubDate>Tue, 13 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2026/golang_1_26_huge_features/</guid>
      <description>&lt;p&gt;隨著時間來到 2026 年初，Go 語言迎來了 1.26 版本的更新。如果說 Go 1.18 的泛型是語言層面的重大變革，那麼 Go 1.26 則是在「數量」與「廣度」上讓人感到驚艷的一次釋出。從語言特性的語法糖、標準庫的實用擴充，到 Runtime 效能的顯著提升（Green Tea GC），甚至是實驗性的 SIMD 支援，這次的更新內容豐富到讓人目不暇給。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Interface 不是有開就好：從一個 PR 來看抽象化的重要性</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/interface-is-not-just-about-creating-one/</link>
      <pubDate>Sat, 04 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2025/interface-is-not-just-about-creating-one/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;最近團隊正在開發一個新產品，其中一個核心功能需要 client 與 server 之間進行即時、雙向的溝通。經過一番技術評估，我們決定採用 WebSocket 來實現這個需求。&lt;/p&gt;
&lt;p&gt;身為一個良好習慣的開發團隊，我們在開發初期就導入了依賴注入（Dependency Injection），希望透過界面（Interface）來解耦商業邏輯與具體的實作，這樣不僅能提高程式碼的可測試性，未來在更換底層實作時也能更加輕鬆。&lt;/p&gt;</description>
    </item>
    <item>
      <title>監控你的執行檔：初探 watchexec</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/watch_your_exec_watchexec/</link>
      <pubDate>Sat, 06 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2025/watch_your_exec_watchexec/</guid>
      <description>前端開發有 liveserver，後端開發有 air，那 TUI 開發呢？本文記錄了我在開發 Bubbletea 應用時，從 air 轉向 watchexec 的心路歷程，以及如何使用這個通用工具來優雅地實現終端機應用的熱重載。</description>
    </item>
    <item>
      <title>用 Golang Bubbletea 打造終端機應用：從 Hello World 到多頁面架構</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/golang_bubbletea_experience/</link>
      <pubDate>Fri, 05 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2025/golang_bubbletea_experience/</guid>
      <description>探索如何使用 Golang 的 Bubbletea 函式庫，基於 Elm 架構，從零開始打造一個互動式終端機應用（TUI）。本文將從一個簡單的計數器範例，逐步引導你建構出一個類似 Web 應用的多頁面架構，並分享整個生命週期中的關鍵概念與注意事項。</description>
    </item>
    <item>
      <title>如何利用 Golang AST 助攻 LLM 省 token 又高效</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/golang_ast_llm_coding/</link>
      <pubDate>Mon, 16 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2025/golang_ast_llm_coding/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;近來大型語言模型（LLM）的發展可謂一日千里，特別是在程式碼理解、生成與輔助開發方面，展現出了驚人的潛力。許多開發者開始嘗試將 LLM 融入到日常工作中，期望能提昇開發效率，甚至實現所謂的「vibe coding」——讓 LLM 理解程式碼的整體風格與意圖，並在此基礎上進行協作。&lt;/p&gt;</description>
    </item>
    <item>
      <title>一次核心模組的重構經驗</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/experience_of_refine_core_module/</link>
      <pubDate>Sat, 14 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2025/experience_of_refine_core_module/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;在軟體開發的漫漫長路中，我們時常會接手一些充滿「歷史印記」的專案。這些專案的核心模組，往往因為業務的快速迭代與時間的無情沖刷，逐漸演化成難以觸碰的「史前巨獸」。近期，我便有幸（或許該說是不幸地）參與了一次這樣核心模組的重構之旅，其核心是我們產品線廣泛使用的 Golang gRPC 認證攔截器 (Interceptor)。這段經歷充滿挑戰，但也收穫良多，希望能藉此分享一些心得。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Golang Iterator 簡介與 samber/lo 比較</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/golang_iterator/</link>
      <pubDate>Sat, 31 May 2025 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2025/golang_iterator/</guid>
      <description>&lt;p&gt;自從 Golang 1.18 版本引入泛型（Generics）後，Go 語言的生態系統迎來了許多令人興奮的變化。其中，Golang 1.23 版本對 Iterator（迭代器）的標準化，以及 &lt;code&gt;iter&lt;/code&gt; 套件的加入，無疑是近期改動中相當重要的一環。本文將淺談 Golang Iterator 的基本概念，深入探討 Pure Iterator 與 Impure Iterator 之間的區別與設計考量，並與社群中流行的 &lt;code&gt;samber/lo&lt;/code&gt; 工具庫進行比較。&lt;/p&gt;</description>
    </item>
    <item>
      <title>建構多平台的 container image</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/building_multiple_platform_container_image/</link>
      <pubDate>Sun, 30 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2025/building_multiple_platform_container_image/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;最近在搞 side project 時，常常需要在不同的 CPU 架構上跑我的應用程式。例如，開發用的 MacBook 是 ARM 架構 (Apple Silicon)，開發用的 Desktop 是 x86 架構（Ryzen 5900X），而部署的伺服器可能是 x86 (AMD64)，有時候甚至想在 Raspberry Pi (ARM) 上跑些小東西。每次都要為不同平台分別建構 image 實在有點麻煩，而且 Registry 上一堆 &lt;code&gt;xxxapp-amd64&lt;/code&gt;, &lt;code&gt;xxxapp-arm64&lt;/code&gt; 的 tag 看了也很礙眼。經過一番研究與嘗試，是時候接觸 Docker Buildx 了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>使用 go work 在本地開發解決同時開發 module 的問題</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/go_module_and_go_work/</link>
      <pubDate>Thu, 20 Feb 2025 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2025/go_module_and_go_work/</guid>
      <description>&lt;p&gt;在 &lt;a href=&#34;https://go.dev/blog/get-familiar-with-workspaces&#34;&gt;Golang 1.18 中 go workspace 的提案&lt;/a&gt;釋出後，golang 的官方文件或多或少也提到應該要怎麼做 multi module 的開發。相較於過去需要不斷的替換 &lt;code&gt;go.mod&lt;/code&gt; 內的 &lt;code&gt;replace&lt;/code&gt; 指令，&lt;code&gt;go work&lt;/code&gt; 大幅改善了 multi module 的開發體驗。&lt;/p&gt;</description>
    </item>
    <item>
      <title>在習慣 go mod 後重新學習 git submodule</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/git_submodule_turorial/</link>
      <pubDate>Fri, 24 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2025/git_submodule_turorial/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;使用 Golang 作為主要開發已經有五年的時間。最近因工作需要接觸到 Python 專案，並且該專案使用 git submodule 的方式來引用共同函式庫 &lt;code&gt;common-lib-python&lt;/code&gt;。對於長久使用 Golang 的 &lt;code&gt;go mod&lt;/code&gt; 的我來說，submodule 是一個相對陌生的概念。藉這個機會撰寫一篇文章，整理並紀錄一下 git submodule 的用法，也作為未來的參考。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Golang Composition over Inheritance</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/golang_composition_over_inheritance/</link>
      <pubDate>Sat, 11 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2025/golang_composition_over_inheritance/</guid>
      <description>&lt;p&gt;Golang 是一門簡潔有力的程式語言，相較於其他程式語言，更傾向於使用組合（composition）而不是繼承（inheritance），語言設計之初更是沒有提供繼承的關鍵字，這種設計哲學讓 Golang 在現代軟體開發中脫穎而出。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Golang 1.22 中 http routing 的改進</title>
      <link>https://www.omegaatt.com/blogs/develop/2024/golang_http_routing_122/</link>
      <pubDate>Wed, 30 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2024/golang_http_routing_122/</guid>
      <description>&lt;p&gt;Golang 作為一個偏向 server 應用的程式語言，一般的 web server 並不會直接使用原生的 package &lt;code&gt;net/http&lt;/code&gt;，而更多的使用 &lt;code&gt;gin-gonic/gin&lt;/code&gt; 或是 &lt;code&gt;gorilla/mux&lt;/code&gt;，後來也有 &lt;code&gt;labstack/echo&lt;/code&gt; 以及 &lt;code&gt;go-chi/chi&lt;/code&gt; 等等選擇，在效能、輕量、好維護、好擴充中，都能找到對應的 third party package，其中的原因不外乎是原生的 package 提供的功能過於簡潔。&lt;/p&gt;</description>
    </item>
    <item>
      <title>使用 TinyGo 與 Raspberry pi pico 實現溫濕度感測器</title>
      <link>https://www.omegaatt.com/blogs/develop/2024/tinygo_temperature_humidity_sensor/</link>
      <pubDate>Wed, 02 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2024/tinygo_temperature_humidity_sensor/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;作為嵌入式系統學習的微小專案，我決定使用 &lt;a href=&#34;https://tinygo.org/&#34;&gt;TinyGo&lt;/a&gt; 來實現一個簡單的溫濕度感測器。過去我大多使用 Arduino 作為微控制器（MCU）開發平台，但這次想嘗試使用 TinyGo 來進行單片機的學習。
TinyGo 是 Go 語言的一個子集，專門針對小型設備和微控制器進行了優化，使得我們可以在資源受限的硬體上運行 Go 程式。&lt;/p&gt;</description>
    </item>
    <item>
      <title>透過內建的 pprof 工具來分析 Golang 發生的 memory leak</title>
      <link>https://www.omegaatt.com/blogs/develop/2024/golang_memory_leak_detection/</link>
      <pubDate>Sat, 17 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2024/golang_memory_leak_detection/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;某天下午，公司的 cronjob daemon 無預警的被 GCP OOM Kill 了，且程式碼沒有看出明顯的原因。&lt;/p&gt;
&lt;p&gt;根據過去的經驗，local 開發時會使用 &lt;code&gt;go tool pprof&lt;/code&gt; 來分析 CPU profile 或是 memory 與 trace 的問題，詳細可以參考 &lt;a href=&#34;https://go.dev/blog/pprof&#34;&gt;Go 官方文件&lt;/a&gt;。&lt;/p&gt;</description>
    </item>
    <item>
      <title>基於 Golang 的 Grafana Dashboard 與 JWT 認證的前後端實作</title>
      <link>https://www.omegaatt.com/blogs/develop/2024/grafana_embed_example/</link>
      <pubDate>Mon, 10 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2024/grafana_embed_example/</guid>
      <description>&lt;p&gt;在工作上有一個需求是需要做一些 &lt;a href=&#34;https://aws.amazon.com/tw/what-is/olap/&#34;&gt;OLAP&lt;/a&gt;，原訂計畫是使用 Google Looker(ver. Google Cloud Core)，礙於量小不符合經濟效益，決定用 Grafana 這個較熟悉的開源套件來幫助我們做視覺化的處理。&lt;/p&gt;
&lt;p&gt;這篇文章的範例可以在 &lt;a href=&#34;https://github.com/omegaatt36/grafana-embed-example&#34;&gt;omegaatt36/grafana-embed-example&lt;/a&gt; 中找到所有的 source code&lt;/p&gt;</description>
    </item>
    <item>
      <title>用 testcontainers 在本地開發 Go 應用程式</title>
      <link>https://www.omegaatt.com/blogs/develop/2024/testcontainers_with_go/</link>
      <pubDate>Sun, 19 May 2024 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2024/testcontainers_with_go/</guid>
      <description>&lt;h2 id=&#34;介紹&#34;&gt;介紹&lt;/h2&gt;
&lt;p&gt;使用 &lt;a href=&#34;https://testcontainers.com/&#34;&gt;testcontainers&lt;/a&gt; 是在本地開發 Golang 應用程式的一個高效方式。這可以讓我們在不需要依賴外部環境的情況下，模擬應用程式在實際生產環境中的運行狀況。&lt;/p&gt;
&lt;h3 id=&#34;安裝-testcontainers&#34;&gt;安裝 testcontainers&lt;/h3&gt;
&lt;p&gt;在 Go 專案中，我們可以通過以下指令來導入 testcontainers&lt;/p&gt;</description>
    </item>
    <item>
      <title>如何利用 Open Policy Agent 配合 Golang 建構彈性的 RBAC 模組</title>
      <link>https://www.omegaatt.com/blogs/develop/2024/golang_rbac_with_open_policy_agent/</link>
      <pubDate>Thu, 04 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2024/golang_rbac_with_open_policy_agent/</guid>
      <description>&lt;h2 id=&#34;rbac-概念簡介&#34;&gt;RBAC 概念簡介&lt;/h2&gt;
&lt;p&gt;在我們探討如何利用 Open Policy Agent (以下簡稱 OPA) 和 Golang 建立一個彈性的 RBAC 模組之前，先讓我們來了解一下 RBAC的基本概念。&lt;/p&gt;
&lt;p&gt;RBAC（Role-Based Access Control，基於角色的訪問控制）是一種廣泛應用的訪問控制策略，在軟體安全性領域尤為重要。其核心思想是將系統訪問權限與用戶的角色（職位、責任或職務）關聯起來，而不是直接與個別用戶關聯。這意味著訪問權限被捆綁到角色上，然後將用戶分配給這些角色。舉個例子，一個「管理員」角色可能有權訪問系統的所有資源，而「員工」角色則只能訪問特定部分的資源。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Golang 隱式記憶體別名 Implicit Memory Aliasing 與其檢測方法</title>
      <link>https://www.omegaatt.com/blogs/develop/2023/golang_implicit_memory_aliasing/</link>
      <pubDate>Sun, 12 Nov 2023 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2023/golang_implicit_memory_aliasing/</guid>
      <description>&lt;p&gt;在使用 Golang 時，我們可能會遇到一種稱為隱式記憶體別名（Implicit Memory Aliasing）的問題。這篇文章將探討這個問題以及如何使用工具和語言特性來解決它。&lt;/p&gt;</description>
    </item>
    <item>
      <title>golang 樂觀鎖、悲觀鎖 學習筆記與實驗</title>
      <link>https://www.omegaatt.com/blogs/develop/2023/golang_lock_practice/</link>
      <pubDate>Sun, 14 May 2023 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2023/golang_lock_practice/</guid>
      <description>&lt;h2 id=&#34;介紹&#34;&gt;介紹&lt;/h2&gt;
&lt;p&gt;改變數值的三個步驟&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;取出&lt;/li&gt;
&lt;li&gt;修改&lt;/li&gt;
&lt;li&gt;保存&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;但這三者間的時間差在不同 process、不同 thread、不同 corutine/goroutine 中會造成競爭危害(race condition)。&lt;/p&gt;
&lt;p&gt;可以使用多種發法確保並行(concurrency)處理時保持資料的一致性，這裡介紹的是最常使用的悲觀鎖與樂觀鎖。&lt;/p&gt;</description>
    </item>
    <item>
      <title>golang 中使用 Line LIFF 實作 Single Sign-On</title>
      <link>https://www.omegaatt.com/blogs/develop/2023/line_verify/</link>
      <pubDate>Sat, 22 Apr 2023 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2023/line_verify/</guid>
      <description>&lt;p&gt;文章中的程式碼放在&lt;a href=&#34;https://github.com/omegaatt36/line-verify-id-token&#34;&gt;https://github.com/omegaatt36/line-verify-id-token&lt;/a&gt;中。&lt;/p&gt;
&lt;h3 id=&#34;requirements&#34;&gt;Requirements&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://developers.line.biz/zh-hant/&#34;&gt;Line Login Channel&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;channel id&lt;/li&gt;
&lt;li&gt;channel secret&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/line/line-liff-v2-starter&#34;&gt;Line LIFF APP&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;用 liff.getIDToken() 獲取 &lt;a href=&#34;https://developers.line.biz/en/docs/line-login/verify-id-token/#get-an-id-token&#34;&gt;ID Token&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在現代網站中，單一登錄 (Single Sign-On, SSO) 已經成為了一個普遍存在的功能，它能夠讓使用者在不同的應用程式和服務之間自動地登錄，而不需要再輸入帳號和密碼。這樣可以方便使用者的使用，並且也能夠增加安全性，減少帳號密碼被盜用的風險。&lt;/p&gt;</description>
    </item>
    <item>
      <title>跟風寫了個使用 OpenAI API 的 Telegram Chat Bot</title>
      <link>https://www.omegaatt.com/blogs/develop/2023/openai_telegram_chat_bot/</link>
      <pubDate>Fri, 17 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2023/openai_telegram_chat_bot/</guid>
      <description>&lt;h1 id=&#34;前言&#34;&gt;前言&lt;/h1&gt;
&lt;p&gt;放在最前面 &lt;a href=&#34;https://github.com/omegaatt36/chatelegram&#34;&gt;Github repo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;原本打算使用別人寫好的 bot，免費的版本均是透過儲存 cookies 的方式，直接透過 ChatGPT 網頁建立新的 「Chat」。好景不常，OpenAI 馬上把登入頁面到聊天頁面中間安插了類似 reCaptcha，來驗證是否為真人。看到有好心人提供了 go 版本的 OpenAi API，就打算自己寫一寫，順便當作 &lt;a href=&#34;https://www.tenlong.com.tw/products/9789864342945&#34;&gt;《Clean Architecture》&lt;/a&gt; 的讀後作業。&lt;/p&gt;</description>
    </item>
    <item>
      <title>gin 搭配 html/template 包實現動態生成 HTML 文件</title>
      <link>https://www.omegaatt.com/blogs/develop/2023/gin_embed_practice/</link>
      <pubDate>Thu, 26 Jan 2023 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2023/gin_embed_practice/</guid>
      <description>&lt;h2 id=&#34;起因&#34;&gt;起因&lt;/h2&gt;
&lt;p&gt;在網站註冊流程中，若是用信箱驗證，網站會寄送一封驗證信到指定的電子信箱。信中可能含有 verify token 或是直接是寫好的 verify URL。至於實作方面我們可以透過 Go 1.16 推出的 Embedding Files 搭配 html/template，實現動態生成 HTML 信件，用以寄送至指定信箱。&lt;/p&gt;</description>
    </item>
    <item>
      <title>後端工程師用 Golang 在 WSL 中寫 GUI 是不是搞錯了甚麼 - 安裝篇</title>
      <link>https://www.omegaatt.com/blogs/develop/2023/golang_gui_fyne_bme280/</link>
      <pubDate>Thu, 26 Jan 2023 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2023/golang_gui_fyne_bme280/</guid>
      <description>&lt;p&gt;由於先前將 raspberry pi 4b 給賣掉了，&lt;a href=&#34;https://github.com/omegaatt36/bmx280/tree/main/raspberrypi&#34;&gt;bmx280&lt;/a&gt; 中基於 bme280 而產生的 exporter 因此失去戰鬥能力，藉此玩玩 &lt;a href=&#34;https://tinygo.org/&#34;&gt;tinygo&lt;/a&gt;，透過 serial port 透過 raspberry pi pico 對 bme280 讀取溫溼度。在開發過程中發現，WSL 中，command line 輸入:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Golang 學習筆記 Day 0 - Why Golang &amp; 安裝篇</title>
      <link>https://www.omegaatt.com/blogs/develop/2020/golang_learning_day0/</link>
      <pubDate>Tue, 25 Aug 2020 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2020/golang_learning_day0/</guid>
      <description>&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;免責聲明，此篇為個人學習筆記，非正式教學文，僅供參考感謝指教，有任何內容錯誤歡迎發 issue。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src=&#34;https://miro.medium.com/max/2946/1*TArmNwMaoXjR1MegmucwyQ.png&#34; alt=&#34;image source: https://medium.com/nordcloud-engineering/how-to-build-pluggable-golang-application-and-benefit-from-aws-lambda-layers-154c8117df9b&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;why-golang&#34;&gt;Why Golang&lt;/h2&gt;
&lt;p&gt;    在高中時期，除了一年級上學期是用 C 打開程式大門之外，大家都知道的，畫金字塔、 &lt;code&gt;cin&lt;/code&gt; 、 &lt;code&gt;cout&lt;/code&gt; 等等基本的邏輯觀念，一年級下學期開始就是 C#、HTML、PHP，也玩轉在 CPLD、Arduino、焊三角錐、兩根同軸焊接，總之就是全部吃掉就對了，雖然都是皮毛但不至於完全沒印象。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Golang 學習筆記 Day 1 - Getting started</title>
      <link>https://www.omegaatt.com/blogs/develop/2020/golang_learning_day1/</link>
      <pubDate>Tue, 25 Aug 2020 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2020/golang_learning_day1/</guid>
      <description>&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;免責聲明，此篇為個人學習筆記，非正式教學文，僅供參考感謝指教，有任何內容錯誤歡迎發 issue。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在前一天介紹了為何要使用 golang、安裝過程以及基本的 hello world，這天將重點放在最基本的 golang 程式碼特徵。&lt;/p&gt;
&lt;h2 id=&#34;packages&#34;&gt;packages&lt;/h2&gt;
&lt;p&gt;正如昨天關於 hello world 的解析中提到的，每個程式都是由一到多個 packages 組成的，也就是 &lt;code&gt;.go&lt;/code&gt; 中必須宣告該檔案是哪個 package，且同一個資料夾中僅接受 &lt;code&gt;xxx&lt;/code&gt; 以及 &lt;code&gt;xxx_test&lt;/code&gt; 兩種 package名稱，也就是該 package 的名稱以及測試檔的「測試包」。&lt;/p&gt;</description>
    </item>
    <item>
      <title>RESTful server based on golang</title>
      <link>https://www.omegaatt.com/blogs/develop/2020/restful-api-with-go/</link>
      <pubDate>Thu, 19 Mar 2020 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2020/restful-api-with-go/</guid>
      <description>&lt;p&gt;很高興有個機會製作面試前的測試作業，也就趁這個機會做個筆記以及學習紀錄。&lt;/p&gt;
&lt;h2 id=&#34;前置作業&#34;&gt;前置作業&lt;/h2&gt;
&lt;p&gt;先點列一下項目需求：&lt;/p&gt;
&lt;h3 id=&#34;基本需求&#34;&gt;基本需求&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;based on golnag&lt;/li&gt;
&lt;li&gt;The API interface you provide can be any of the following：RESTful、json rpc、gRPC&lt;/li&gt;
&lt;li&gt;At least two sources&lt;/li&gt;
&lt;li&gt;When a source is unavailable, the result of its last successful ask is returned&lt;/li&gt;
&lt;li&gt;Use git to manage source code&lt;/li&gt;
&lt;li&gt;Write readme.md and describe what features, features, and TODO which have been implemented&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;額外可選&#34;&gt;額外可選&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Traffic limits, including the number of times your server queries the source, and the number of times the user queries you&lt;/li&gt;
&lt;li&gt;Good testing, annotations, and git commit&lt;/li&gt;
&lt;li&gt;An additional websocket interface is provided to automatically send the latest information whenever the market changes&lt;/li&gt;
&lt;li&gt;Users can choose to use an automatic source determination, the latest data source, or manually specify the source of the data&lt;/li&gt;
&lt;li&gt;Package it as a Dockerfile, docker-compose file, or kubernetes yaml&lt;/li&gt;
&lt;li&gt;There is a simple front-end or cli program that displays the results&lt;/li&gt;
&lt;li&gt;The API you provide has a corresponding file, such as a swagger, or simply a markdown file&lt;/li&gt;
&lt;li&gt;Other features not listed but that you thought would be cool to implement&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這邊就必須要先打預防針了，&lt;strong&gt;這篇僅為學習筆記&lt;/strong&gt;，並非正式教學。且，我只是 Golang 初學者，所以這篇內也不會出現什麼高等級的解法，甚至也是第一次實作介接 API 呢 (笑)。而 DB 以及 redis 都是直接以方便使用去寫 dbi 而已並無用抽象曾去封裝，也進而導致 unit test 十分困難先擱置了，有空才會再針對性重構，而此次就先將目標專注在 API 介接。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Codewars Find X II in golang</title>
      <link>https://www.omegaatt.com/blogs/develop/2020/codewars_find_x_ii/</link>
      <pubDate>Tue, 03 Mar 2020 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2020/codewars_find_x_ii/</guid>
      <description>&lt;p&gt;想不到一眨眼半個月過去了，自從面試趨勢之後整個人彷彿被電到失去信心，在離職與等待面試消息期間，也只好振作補足不足的地方繼續向前。&lt;/p&gt;
&lt;p&gt;而 docker 學習心得何時會產出呢？在學習過程中發現除了一般操作(day1 內容)外，底層或多 container 溝通都是大量的網路觀念與知識，需要更多知識量才能整理成筆記，不急不急。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
