タグ

golangに関するokinakaのブックマーク (48)

  • Goのアンチパターン集

    Go言語で開発を続けていると、便利な言語機能ゆえについ陥ってしまう非推奨なコーディングパターン=アンチパターンが存在します。記事では、広範なカテゴリーにわたるアンチパターンとその改善策を、具体的なコード例とともに解説します。各アンチパターンについて、その状況と文脈、問題点(保守性・性能・正当性への悪影響)、そして推奨されるベストプラクティスや改善例を示します。 コーディングスタイルにおけるアンチパターン まずは基的なコーディングスタイル上のアンチパターンです。これらはコードの可読性や意図の明確さを損ね、場合によってはバグの温床にもなりかねません。 Blank識別子(_)の不必要な乱用 アンチパターンの文脈: Goでは使わない変数を表すためにブランク識別子_が使えますが、不要な場面で乱用するケースがあります。例えばforループでインデックス変数を使わないのに_で受けてしまう、あるいはマッ

    Goのアンチパターン集
  • Go で新しいサービスを実装する際に意識したポイント - Cybozu Inside Out | サイボウズエンジニアのブログ

    こんにちは!ソフトウェアエンジニアとして活動している @nissy_dev です。 サイボウズでは、各プロダクトを新しいインフラ基盤に移行する取り組みを進めています。この記事では、その一環としてサイボウズ Office とメールワイズのテナント管理ロジックを Go で新たに実装する際に意識したポイントについて紹介します。 目次 テナント管理ロジックのオーナシップの移行 Go を利用した新しいサービスのモノレポ開発 ディレクトリ構成 ビルドやリントツール エラーハンドリング ログとメトリクス テスト CI まとめ テナント管理ロジックのオーナシップの移行 現在、Cybozu では各プロダクトを新しいインフラ基盤「Neco」へと移行中です。この移行は、サービス運用の効率性と柔軟性を向上させるための重要なステップになっています。 この新しい基盤に移行する前は、kintone、Garoon、サイボ

    Go で新しいサービスを実装する際に意識したポイント - Cybozu Inside Out | サイボウズエンジニアのブログ
  • GoでLuaのユニットテストを書こう | CyberAgent Developers Blog

    ABEMAの広告システムのバックエンド開発をしている黒崎 (@kuro_m88) です。 GoでLuaのユニットテストの実装を試みた事例をご紹介します。 GoでLuaのユニットテストを書くモチベーション 端的に言うとGoで書いているアプリケーションサーバでValkeyを使っており、Valkeyの機能を拡張するのにLuaで処理を記述する必要が出たためです。 Valkeyとは Valkeyはインメモリデータベースで、2024年に諸般の事情からRedisをforkする形でLinux Foundation傘下で開発がはじまりました。 ValkeyはRedisからforkされたため大半の機能はRedisと互換性がありますが、AWS, Google Cloud, Oracle Cloudなどの大手企業が開発に参加しており、積極的にサポートする姿勢が見てとれます。 Amazon ElastiCache

    GoでLuaのユニットテストを書こう | CyberAgent Developers Blog
  • Goのテストをはじめてみよう(2025年版) | フューチャー技術ブログ

    春の入門祭り2025 13目の記事です。 はじめに製造エネルギー事業部の辻です。Goのテストをはじめてみよう、という記事です。 この記事は、5年前の2020年に私が執筆したGoのテスト入門記事(Goのテストに入門してみよう!)のリメイク版です。当時は執筆したときのGoのバージョンは1.14でした。記事はありがたいことに継続的に反響をいただいていたものの、いくつか記述が古くなっていた点がありました。そこで今回Go1.15以降で導入された機能や、周辺のアップデート等を取り込み、改良しました。 Go のテストに関するヒント集としてお役に立てれば幸いです。 TipsGo のテストの仕組みに、ベンチマークに関するテストと Example テストというサンプルコード用のテストも含まれているのですが、この2つは対象外にします。基礎的と思われる内容から順に並べてみました。 Tipsテストがしたいテストの

    Goのテストをはじめてみよう(2025年版) | フューチャー技術ブログ
  • 少しずつ育てるGo言語のプロジェクト構成

    23/9/21追記:この記事を読む前に ついにGoチームから、プロジェクト構成に関するガイドが公開されました! 記事を読んでくださることも大変嬉しいですが、ぜひこちらのガイドもご一読ください! この記事は何 Go言語を書いたことがある方も、興味はあるけど触ったことがない方もこんにちは。 Goに限った話ではないと思いますが、ガリガリコードを書いていて、あるタイミングで気になるのがプロジェクト構成(ここではディレクトリ構成の意図)ではないでしょうか? それを裏付けるかのように、Go界隈では以下のリポジトリが話題に上がることがあります。Star数すごいですね😇 リポジトリ名から公式感が漂いますが、そういう訳ではないのがミソです。 こちらのリポジトリ冒頭にも記載されていますが、次の点に留意する必要があるでしょう。 これは、Goアプリケーションプロジェクトの基的なレイアウトです。これは、コアと

    少しずつ育てるGo言語のプロジェクト構成
  • FeatureFlagツール内製化で実現するトランクベース開発 | CyberAgent Developers Blog

    はじめに こんにちは!AI事業部 アプリ運用カンパニーでバックエンドエンジニアをしている26卒内定者の荻原瑛史です。 記事では、CyberAgent内定者バイト期間中にトランクベース開発(Trunk‑Based Development)をバックエンドチームへ導入し、それを支えるFeature Flag管理ツールをOpenFeature仕様に準拠して内製した取り組みを紹介します。 トランクベース開発とは トランクベース開発は各開発者が作業を小さな単位に分割し、少なくとも1日に1回メインブランチへマージを行うことで継続的インテグレーションを実現します。長期間存続するブランチを排除し、マージコンフリクトとレビューコストを大幅に削減できる点が最大のメリットです。 しかしながら未完成の機能がそのままmainブランチにマージされると番環境に反映されてしまうため、Feature Flagで機能の切

    FeatureFlagツール内製化で実現するトランクベース開発 | CyberAgent Developers Blog
  • Goのカスタムエラーとその自動生成について - asterisc

    はじめに この記事はGo2アドベントカレンダー14日目の記事です。 GoErrorハンドリングについては、これまでにも様々なパターンが発表されてきました。 今回は独自定義のエラーについて、これまでのパターンをまとめた上で、その実現をeasyにするgenerrというツールを作ったので、その紹介をします。 github.com Goのカスタムエラー Goのエラーハンドリングの中で、カスタムなerror型を用いるパターンは比較的広く知られているかと思います。 その中からいくつかのパターンを紹介します。 sentinel errorsパターン Goerrorはinterfaceとして定義されており、Error() stringのメソッドを実装さえしていれば、errorとして扱うことができます。 標準パッケージで提供されているerrorsやfmt.Errorfを用いて簡単にエラーを表現することが

    Goのカスタムエラーとその自動生成について - asterisc
  • よくわかるcontextの使い方

    Goの標準パッケージにはcontextパッケージというものが存在します。 このパッケージは、net/httpやdatabase/sqlのような現実の事象と対応している何かが存在するようなパッケージではないため、初学者にとっては使い道がわからない、となってしまいがちです。 しかしcontextパッケージは、複数のゴールーチンを跨いだ処理を実装する際には非常に強力な力を発揮する、とても便利なパッケージなのです。 このでは、「contextとは何か?」というところから「どのように使えばいいのかわかる」ところまでたどり着けるように、Goのcontextまわりのことを解説しました。

    よくわかるcontextの使い方
  • Context deadline exceeded - What to do?

  • go test の33個のフラグを全て解説してみた!!! (サンプルコード付き)

    またこのブログでは testing パッケージの使い方やpackageの指定の仕方などに関して、詳細な説明はしません。 フラグを全部見てみる とりあえずすべてのフラグを見てみます! 以下のコマンドを実行すれば、現時点 (2024/10) で go test が受け付けるすべてのフラグが分かります。 The 'go test' command takes both flags that apply to 'go test' itself and flags that apply to the resulting test binary. Several of the flags control profiling and write an execution profile suitable for "go tool pprof"; run "go tool pprof -h" for mo

    go test の33個のフラグを全て解説してみた!!! (サンプルコード付き)
  • Introduction - Testcontainers for Go

  • DockertestとLocalStackを使って 外部サービスに依存した多要素認証の 動作確認・テストをした話 / A story about using Dockertest and LocalStack to check and test the operation of multi-factor authentication that depends on external services

    2024/06/08: Go Conference 2024 https://gocon.jp/2024/ DockertestとLocalStackを使って 外部サービスに依存した多要素認証の 動作確認・テストをした話 西田 智朗 ソフトウェアエンジニア

    DockertestとLocalStackを使って 外部サービスに依存した多要素認証の 動作確認・テストをした話 / A story about using Dockertest and LocalStack to check and test the operation of multi-factor authentication that depends on external services
  • GoのHTTPクライアントについて

    HTTPリクエストを受け取るサーバーの作り方を覚えたら、 次はHTTPリクエストを送信するクライアントについて知りたくなりますよね!? 外部サービスのAPIをコールする時や、マイクロサービス内のAPIを呼び出す時など クライアントを使用する機会は多くあると思います。 ということでGoのHTTPクライアントについて社内勉強会で紹介していきます。 GoのHTTPクライアント 標準ライブラリのnet/httpパッケージを使ってHTTPリクエストを送信します。 https://pkg.go.dev/net/http リクエスト送信の一番簡単な方法としては、http.Get(), http.Post()を使うことです。 これらはリクエスト時の細かい制御がしにくいので、 詳細な設定を行いたい場合は、http.Clientを生成してカスタムする方法をとります。 一例として、次のようなHTTPクライアント

    GoのHTTPクライアントについて
  • 構造体のフィールドをJSON Schemaでvalidationする - Qiita

    はじめに 構造体のstringフィールドにJSONを格納するときにJSON Schemaで手軽にvalidateする方法を紹介します。 gopkg.in/go-playground/validator.v9 validatorにはgopkg.in/go-playground/validator.v9を使います。 構造体の各フィールドに正しい値が入っているかどうかをお手軽にチェックするライブラリです。型だけではチェックできないような性質もチェックできるようになります。 他にも似たようなライブラリはありますがこれが一番validationの種類が多くシンプルでした。 構造体にvalidateタグでvalidationの種類を指定するだけでチェックできるようになります。 例えば次のような構造体Userを定義できます。

    構造体のフィールドをJSON Schemaでvalidationする - Qiita
  • Goでtime.Now()を使用している箇所のテストについて

    概要 time.Now()を使用している箇所のテストがしづらいと感じたのでその際のメモ 結論:contextにtime.Now()で生成する方法を採用 既存のコード func Hoge() { todo := GetTodo() if IsTimeAfter(todo.StartTime) { ... } } func IsTimeAfter(startTime time.Time) { currentDate := time.Now() // テストを実行する時刻に依存する。現在日時を固定にしたい。 return startTime.After(currentDate) } func Hoge() { todo := GetTodo() currentDate := time.Now() if IsTimeAfter(todo.StartTime, currentDate) { ...

    Goでtime.Now()を使用している箇所のテストについて
  • LocalStackとaws-ses-v2-localを使って非同期のメール送信をローカルで再現する

    UnsplashのKristina Tripkovicが撮影した写真おはこんばんちは。 Finatextグループのクレジット事業でソフトウェアエンジニアをしている Hanake です。 ところで、皆様はローカルでのメール送信をどのようにテストされていますか? SMTP サーバを立ててテストしていますか?もしくは開発環境用にマネージドなメール送信サービスを利用していますか? いずれにせよ、番との環境の差異やコスト面での課題があるかと思います。 今回は、LocalStack と aws-ses-v2-local を使って可能な限り番に近い環境で非同期のメール送信をローカルで再現する方法をご紹介します。 LocalStack とはLocalStack は、Amazon Web Services(以下 AWS) のクラウドサービスをローカルでエミュレートするためのツールです。 AWS の主要サ

    LocalStackとaws-ses-v2-localを使って非同期のメール送信をローカルで再現する
  • Go製プロダクトのCI構築に役立つツール&ライブラリ紹介|NAVITIME_Tech

    はじめにこんにちは、くるふとです。 ナビタイムジャパンで、時刻表 API や地図描画 API の 開発・運用業務を主に担当しています。 今回は Go 製プロダクトの CI 構築に役立つツール&ライブラリ群を紹介します。 私は API の開発業務をこなしていく際、 CI の設計を常に意識しています。 継続的な機能のリリースを実現するにあたって、 CI の最適化は避けて通れない領域だと考えています。もちろん、 Go を用いた開発業務でもこの考えは変わりません。 昨今では Go の導入事例が増えつつあります。当社でも Go 製のプロダクトの数は増えてきており、Go 関連のツールやライブラリの知見が集まりつつあります。その過程で、Go 製プロダクトの CI 設計についての議論も多くなってきました。 これは Go 関連のツールやライブラリを記事にまとめる良いタイミングなのではと考え、この記事を執筆し

    Go製プロダクトのCI構築に役立つツール&ライブラリ紹介|NAVITIME_Tech
  • Goのテストと各種オプションについて

    今回はGoのテストとそれに関わるオプションなどについて書いていきます。 Goのテストの基 Goにはテスト用のフレームワークなどは用意されておらず、テストもGoそのものの書き方で書くことができます。フレームワークはありませんが、testingというテスト用の標準パッケージが用意されており、それを使ってテストを書いていくことになります。また他の多くの言語と異なり、テストファイル用ディレクトリを作成するのではなく、テスト対象のファイルが存在するディレクトリにテストファイルを作成する形を取ります。 Goのテストファイルはテスト対象ファイル名_test.goというファイル名にします。テスト関数はTestという文言で初め、*testing.T型の引数をとり、引数の名前は慣習でtとします。以下のようなコードがあるとします。

    Goのテストと各種オプションについて
  • GolangでAPIを作る時に見るレシピ集

    はじめに GoAPIを作る際によく書く処理をまとめてみました。 今後も何かよく使う実装を思い付き次第、引き続き加筆・修正していく予定です。 説明の都合上、レイヤーを意識していない実装になっている箇所があるので、適宜カスタムして使ってください。

    GolangでAPIを作る時に見るレシピ集
  • Go製アプリケーションのコンテナ化にはkoを推したい - YAMAGUCHI::weblog

    はじめに こんにちは、Google Cloudでオブザーバビリティを担当しているものです。Cloud Operations suiteをよろしくおねがいします。(宣伝終わり) この記事はGo Advent Calendar 2021 その1の22日目の記事です。昨日は @sago35tk さんの「ESP32 向けに TinyGo をセットアップする」でした。TinyGoのコアな情報を日語で教えてくれるtakasagoさんには当にいつも感謝しています。 さて、今日はGo製のアプリケーションをdockerlessでコンテナ化できるkoの紹介をします。koは当にイチオシのツールで、みんなに使ってもらいたいのでぜひ使ってください。 github.com DockerによるGo製アプリのコンテナ化 まず最もポピュラーと思われるDockerを用いた場合のGo製アプリケーションのコンテナ化の方法に

    Go製アプリケーションのコンテナ化にはkoを推したい - YAMAGUCHI::weblog