Golang

初めてのGo言語 第2版 ―他言語プログラマーのためのイディオマティックGo実践ガイド

アプリケーション

初めてのGo言語 第2版 ―他言語プログラマーのためのイディオマティックGo実践ガイドを読んだ。 久しぶりに業務でGoを書く機会に恵まれたので、新しい情報のキャッチアップや復習を兼ねて読んだ。 この本は単なる入門書ではなく、Goの思想やイディオムを沢山紹介しており、Goという言語の理解を深めることができる。 他の入門書は拾わなさそうなことも拾われており、良書であった。 ...

Golang

継承より委譲について

アプリケーション

はじめに オブジェクト指向プログラミング(OOP)は「現実のモノをプログラムで表現する」ための考え方である。しかし、現実の分類や言葉の定義をそのままプログラムへ持ち込むと、思わぬ破綻を招く。 本記事では、「四角形と正方形」という具体例を通じて、以下の3つの重要な概念を解説する。 ダックタイピング - 名前ではなく振る舞いで型を判断する リスコフの置換原則(LSP) - 振る舞いの互換性を保証する...

ダック・タイピング リスコフの置換原則 委譲 継承 Golang

テストダブルとは何か

アプリケーション

はじめに 単体テストを書く際、テスト対象のコードが外部のデータベース、APIサーバー、ファイルシステムなどに依存していると、以下のような問題が発生する: テストの実行が遅い テスト環境の準備が複雑 テスト結果が不安定(ネットワークエラーなど) 特定の状態やエラーケースの再現が困難 これらの問題を解決するために使われるのがテストダブル(Test Double)である。 テストダブルとは、テストに...

Golang テストダブル テスト

なぜインターフェースの方が実装より変更頻度が低いのか

アプリケーション

クリーンコードクックブック ―コードの設計と品質を改善するためのレシピ集を読んでいて、インターフェースの実装よりも変更頻度が低いという主張が気になったので、言語化してみた。 インターフェースは「契約(contract)」であり「抽象」 インターフェース(interface)は、 「この機能はこう使える」という"契約"を表すものである。 一方で実装(implementatio...

Golang インターフェース

Singletonパターンはなぜアンチパターンなのか

アプリケーション

はじめに シングルトンパターンは、デザインパターンの中でも最もよく知られ、広く使われているパターンの一つである。しかし、クリーンコードや保守性の観点から見ると、多くの問題を抱えている。 本記事では、シングルトンパターンの主要な問題点について、具体的なGoのコード例を交えながら解説する。 シングルトンパターンとは シングルトンパターンは、クラスのインスタンスが常に1つだけ存在することを保証するデザイ...

シングルトンパターン Golang

TUI開発で役立つターミナル仕様の理解

アプリケーション

はじめに TUI(Terminal User Interface)アプリケーションを開発する際、vimやhtopのような既存のTUIライブラリを使えば簡単に実装できる。しかし、その裏でターミナルがどのように動作しているのか、なぜRaw Modeが必要なのか、ANSIエスケープシーケンスとは何なのかを理解していないと、高レベルのAPIが何をしているのかわからず、問題が起きたときに対処しづらい。 本記...

TUI termios ターミナル UNIX Golang

Goでプロセス・goroutine・メモリを覗いてみた

アプリケーション

概要 Goを使って、プロセスのアドレス空間・goroutineの動作・スタックとヒープを軽く覗いてみる。 子プロセスとアドレス空間の違いを確認する Goでは標準的にos/execパッケージを使って新しいプロセスを起動する。 os/execは内部的にUnix系OSではfork()+exec()相当の処理を行い、新しいプログラム(この例では自分自身)を実行する。 親子プロセスで同じ変数のアドレスを表...

Golang メモリ ヒープ スタック プロセス スレッド

Go製Git操作ツール「ggc」の紹介

アプリケーション

Go製Git操作ツール「ggc」の紹介 ggcとは何か ggcは、Go言語で実装されたGit操作支援ツールである。「覚えやすく、使いやすく、作業効率の向上を図る」ことを目的としており、日常的なGit操作をより快適にすることを意図している。 既存のGitクライアントツールには、機能が豊富すぎて学習コストが高いもの、あるいはシンプルすぎて実用に耐えないものが存在する。ggcはこのギャップを埋めるべく、...

Golang Git CLI TUI

Goの並行・並列処理モデルとgoroutineスケジューリング

アプリケーション

概要 Go言語は、軽量なgoroutineとランタイム機構により並行処理(concurrency)を強力にサポートし、Go 1.5以降はデフォルトでGOMAXPROCSが利用可能CPUコア数に設定されるため、適切に設定することでマルチコアを活かした並列実行(parallelism)も可能とする。本記事では、goroutineのスケジューリングやCPUバウンド処理でのマルチコア活用の仕組み、OSプロ...

Golang

GoReleaserを使ってDocker Imageをbuild&pushする

アプリケーション

以前、GoReleaserを使ってのGoのアプリケーションを配布するというタイトルの記事でGoReleaserを使ったバイナリ配布の方法について書いたが、Dockerhubへのイメージプッシュもやってみたのでまとめておく。 ソースコードの全体像はbmf-san/gondolaを参照。 .goreleaser.yamlを設定 ockers: - image_templates: - ...

Golang GitHub Actions