golangに関するtakehirohattoriのブックマーク (694)

  • Cleanup handling in Go / Go Conference 2024

    CI/CDがあたりまえの今の時代にAPIテスティングツールに求められていること / CI/CD Test Night #7

    Cleanup handling in Go / Go Conference 2024
    takehirohattori
    takehirohattori 2024/06/09
    後始末処理、終了処理 defer, func (*Server)RegisterOnShutdown, func (*T) Cleanup, func AfterFunc, dongroup.Cleanup
  • Goでモンキーパッチするライブラリを作った - Plan 9とGo言語のブログ

    Goで単体テストを実装する場合、動的な言語のように「テスト実行中に外部への依存を置き換える」といったことはできません。代わりに、 外部への依存を引数で渡す 外部への依存をインターフェイスで渡す のように、テスト対象をテスト可能な実装に変更しておき、テストの時は外部への依存をモック等に置き換えて実行する場合が多いのではないかと思います。 個人的な体験でいえば、テスト可能な実装に置き換えていく過程で設計が洗練されていく*1ことは度々あるので、面倒を強制されているというよりは設計を整理するための道具といった捉え方をしているのですが、そうは言っても動的な言語に比べると面倒だなと感じるときは少なからずあります。既存の実装がテスト可能になっておらず、変更するコストが高い場合は特にそうですね。 そんなとき、気軽にモンキーパッチできると嬉しいんじゃないかと思って、テストの時だけ関数を置き換えられるようなラ

    Goでモンキーパッチするライブラリを作った - Plan 9とGo言語のブログ
  • Go製バイナリを配布するためのGitHubワークフロー - Plan 9とGo言語のブログ

    前置き 以前、BuildInfoからバージョンを取得する方法を紹介しました。 blog.lufia.org go installで正規の公開されたバージョンをインストールした場合は、以下の出力においてmodの行が示すように、sum.golang.orgでチェックサム等が検証されてバイナリのメタデータに埋め込まれます。 $ go version -m dotsync dotsync: go1.22.2 path github.com/lufia/dotsync mod github.com/lufia/dotsync v0.0.2 h1:JWm92Aw8pSKJ4eHiQZIsE/4rgwk3h5CjEbJ/S30wiOU= build -buildmode=exe build -compiler=gc build -trimpath=true build DefaultGODEBUG=ht

    Go製バイナリを配布するためのGitHubワークフロー - Plan 9とGo言語のブログ
  • PostgreSQL LISTEN/NOTIFY, Goを利用したリアルタイム配信

    はじめに 記事では、PostgreSQLのLISTEN/NOTIFY機能とGoを組み合わせた、メッセージをリアルタイム配信するための仕組み・実装を紹介します。 私たちが開発しているMiROHA eConsentでは記事で紹介する仕組みを利用して、ユーザが見ている文書のページをリアルタイムに知らせる機能をリリースしました。 MiROHA eConsentは、治験業務支援サービス MiROHAのシステムの一部で 、治験の同意取得プロセスをオンラインのみで完結させることができるプロダクトです。医師とCRC[1]・被験者が同じルームに入室し、ビデオ通話を繋ぎながら治験に関する説明から同意署名、署名した文書のダウンロードまで一気通貫で行うことができます。 MiROHAシステムの全体図。医師/CRCと被験者の間で同意取得ができる機能を提供しているのがMiROHA eConsentになります。 プロ

    PostgreSQL LISTEN/NOTIFY, Goを利用したリアルタイム配信
  • Go 言語のオーサリングツールの godzil を使ってみた - ChangeLog - noissefnoc

    はじめに Go 言語でプロジェクトをはじめるときに設定ファイルや Makefile を既存レポジトリからコピーしていました。しかし、抜け漏れやいつまでも古い設定を引き継いでいくのもあまり良くないと思い、何かしらのオーサリングツールがないか探していました。 そこで www.songmu.jp で godzil を知ったので試してみました。 使ってみた感想と、現状作者の方のテンプレートしかないのですが、他の種類のテンプレート追加するにはどうすればよいかを調べてみました。 TL;DR Golang のオーサリングツールの Songum/godzil を使ってみた Songum/godzil で雛形を追加する方法を調べた (v0.2.3 での確認) Songum/godzil を git clone make devel-deps で開発に必要なモジュールをインストール testdata/asse

    Go 言語のオーサリングツールの godzil を使ってみた - ChangeLog - noissefnoc
    takehirohattori
    takehirohattori 2024/03/16
    “Go 言語でプロジェクトをはじめるときに設定ファイルや Makefile を既存レポジトリからコピー~~抜け漏れやいつまでも古い設定を引き継いでいくのもあまり良くない~~何かしらのオーサリングツール”
  • More powerful Go execution traces - The Go Programming Language

    The Go Blog More powerful Go execution traces Michael Knyszek 14 March 2024 The runtime/trace package contains a powerful tool for understanding and troubleshooting Go programs. The functionality within allows one to produce a trace of each goroutine’s execution over some time period. With the go tool trace command (or the excellent open source gotraceui tool), one may then visualize and explore t

    More powerful Go execution traces - The Go Programming Language
  • Goで関数の引数に、union型っぽくstruct Aもしくはstruct Bのどちらかを受け取れるようにしたい - $shibayu36->blog;

    Goで関数の引数に、struct Aという型もしくはstruct Bのどちらかを受け取るということをしたかった。interfaceをちゃんと切ってそれに必要なメソッドをAとBに実装することで実現できることを知った上で、あまり丁寧にそういうことをせずにやりたい。 色々調べると、genericsを使うとできるようだ。 package main import "fmt" type A struct { Field1 int } type B struct { Field2 string } type AorB interface { A | B } func PrintAorB[T AorB](s T) { // Tで受け取ったものをそのままs.(type)とは出来ないので、一旦anyへキャスト switch v := any(s).(type) { case A: fmt.Println(v.

    Goで関数の引数に、union型っぽくstruct Aもしくはstruct Bのどちらかを受け取れるようにしたい - $shibayu36->blog;
  • yamlでテストシナリオを書いてそのまま実行までできるAPIテストツールの新星 “runn” を試してみた | DevelopersIO

    yamlでテストシナリオを書いたらそのまま実行できる……そんな夢のようなシナリオテストツール"runn"の紹介とやってみた記録です これまでのシナリオテストツールに対する課題感 シナリオテストツールといえば、 Cucumber や Gauge といったツールが有名です。 ですが、これらのツールは「シナリオファイル」とは別に、シナリオを実行するためのコードも書かないといけません。しかも、そのコードではAPIを呼び出す処理を特定のプログラミング言語を使って書かなければなりません。その中には、HTTP Clientを実際に操作するような処理も含まれます。 私は「シナリオテストがしたい」のであって、「シナリオに沿ってAPI呼び出しを行う処理を書きたい」のではありません。こういった課題感を、ここ数年ずっと抱えてきました。 そんなとき、ついに見つけたツールが "runn" でした。 APIのシナリオテ

    yamlでテストシナリオを書いてそのまま実行までできるAPIテストツールの新星 “runn” を試してみた | DevelopersIO
  • 現場で役立つGo言語のTipsをただまとめてみた

    はじめに こんにちは、23卒でバックエンドエンジニアをしているたかしゅんです。 私の所属しているプロダクトではサーバーサイドの開発言語としてGoを採用しております。 チームでGoの勉強会をした際にあまりにもGoの流儀や綺麗な書き方を理解していなかったので、以下の書籍を読みました。 [Go言語 100Tips ありがちなミスを把握し、実装を最適化する] この書籍から得た知見、プルリクエストのレビューで受けたアドバイス、そしてコードレビュー時に意識すべき点などを基に、知識を整理し共有したいと思います。 基礎文法は理解しているけど、実際のプロダクトで何を意識して書けば良いのかわからない方に、少しでも参考になれば幸いです。 1. コード 1.1 不用意にネストしない 可読性の悪いコードには命名、一貫性、書式など様々な原因がありますが、その中の重要な原因の一つとしてネストが関係します。 よくある例と

    現場で役立つGo言語のTipsをただまとめてみた
  • もっと log/slog を使おう

    はじめに この記事は Go アドベントカレンダー 2023 の最終日 25 日目の記事です。 皆さん log/slog 使ってますか。便利なのでぜひ使ってください。 slog は構造化ログを出力する為のパッケージで Go 1.21 で導入されました。これまでも zap や zerolog といったサードパーティ製のロガーを使う事で構造化ログを出力する事ができましたが、構造化ログを出力する機能が Go の標準ライブラリになりました。 slog とは 通常の log パッケージは、時刻とメッセージの単純な出力になります。

    もっと log/slog を使おう
  • GoのASTを解析してFeature Toggleを掃除する - freee Developers Hub

    この記事はfreee Developers Advent Calendar 2023の21日目の記事です。 こんにちは、金融開発部でEMをしている ogugu です。 今回は、Go言語において Feature Toggle の分岐を掃除するCLIを作ったので、ご紹介します。 ※ 毎年恒例の開発合宿 での成果になります。 Feature Toggle とは Feature Toggle とは、特定機能の有効・無効をフラグによって切り替える方法です。 金融開発部では、以下のように Feature Toggle を実現できるライブラリを用意しています。 if featflg.Enabled(ctx, "feature_name") { doNewLogic() } else { doOldLogic() } 一般に、フラグ設定は、設定ファイル・環境変数・ストレージなどから読み出し、それらに対する

    GoのASTを解析してFeature Toggleを掃除する - freee Developers Hub
  • 後方互換性のあるGoだからこそ実装依存なコードに気をつけたい話

    \スニダンを開発しているSODA inc.の Advent Calendar 2023 21日目の記事です!!!/ そして今日はIPAデータベーススペシャリスト試験の合格発表日でもあります! 無事合格してました!(これを書いているときはまだ発表前なので未来の記憶です) はじめに Goの大きな特徴として後方互換性が保たれているので、言語のバージョンアップのハードルが低いというメリットがありますよね。 ですが、そんなGoでも完全な互換性を保証しているわけではありません。特定のケースにおいてバージョンアップによってプログラムを壊す可能性があるのです。 実際に遭遇することは少ないかもしれませんが、どういうケースでそれが起こるのか、どうすれば回避できるのか、実際にあった過去の事例を交えて知っておくと、バージョンアップ時の漠然とした不安を減らし後方互換性の恩恵を最大化できるようになると思います。 実際

    後方互換性のあるGoだからこそ実装依存なコードに気をつけたい話
  • sqlcとdockertestでデータベースを使ったテストを書こう | gihyo.jp

    Goにおけるデータベース操作とテスト Goでデータベースを操作する際には、標準パッケージであるdatabase/sqlGORM、entなどの様々な選択肢が存在します。多くのライブラリではGoのコードを定義してSQLを生成しますが、sqlcはSQLをコンパイルしてGoのコードを生成するのが特徴のライブラリです。 このアプローチには、最終的に実行されるSQLが明らかであることやデータベースとやりとりするためのデータ構造を自分で定義する必要がないことといったメリットがあります。また、コンパイル時にSQLを解析し型や引数名の間違いを検出できます。そしてなにより、非常にシンプルです。 記事では、sqlcの一歩進んだ使い方としてdockertestと組み合わせたテストの書き方について紹介します。dockertestとは、Dockerコンテナを立ち上げてテストを実行するための使いやすいコマンドを提供

    sqlcとdockertestでデータベースを使ったテストを書こう | gihyo.jp
  • goroutine leakを解消したい!

    この記事は、Magic Moment Advent Calendar 2023 15日目の記事です。 こんにちは! Magic Moment で Backend Engineerをしている 大塚 です。 Magic MomentではGo言語によるマイクロサービス開発をしているのですが、ある日、あるサービスのメモリ使用量が継続的に上昇する現象を観測しました。 そこで、どういった調査をしてどのように解消までいったかをまとめました。 メモリ使用量の上昇を観測 メモリ使用量が日々上昇していることが確認できます。さっそくどこで何が原因でメモリリークしているか確認してみます。 Cloud Profilerで確認 以前よりCloud Profilerを導入していたため、まずはCloud Profilerでメモリ使用量やgoroutineの数を確認しました。 Cloud Profilerについては弊社Te

    goroutine leakを解消したい!
  • research!rsc: Go Testing By Example

    I opened GopherCon Australia in early November with the talk “Go Testing By Example”. Being the first talk, there were some A/V issues, so I re-recorded it at home and have posted it here: Here are the 20 tips from the talk: Make it easy to add new test cases. Use test coverage to find untested code. Coverage is no substitute for thought. Write exhaustive tests. Separate test cases from test logic

  • Go 1.22で追加予定のrange over intと、GOEXPERIMENT入り予定のrange over funcを触ってみる - every Tech Blog

    目次 はじめに range over int range over intとは range over intをGo Playgroundで触ってみる range over intを用いる利点 よくあるfor文が簡潔になる リーディングコストが軽減される range over func range over funcとは range over funcをGo Playgroundで触ってみる func(func()bool) func(func(V)bool) func(func(K, V)bool) range over funcを用いる利点 シンプルで標準的なイテレータを実装できる おわりに Appendix: range over funcを理解するコツ はじめに 株式会社エブリーでDELISH KITCHEN事業のバックエンドエンジニアをしている、GopherのYuki(@YukiB

    Go 1.22で追加予定のrange over intと、GOEXPERIMENT入り予定のrange over funcを触ってみる - every Tech Blog
  • 2023年の Go での気づきに思いを馳せて構築するオレオレ Go サーバープロジェクトレイアウト

    2023 年は念願叶い業務でも趣味でも Go を触ることができました。 そんな 2023 年での Go での気づきに思いを馳せ、タスク管理をするような簡単なサーバーを構築しそのプロジェクトレイアウトをご紹介してみます。 気づきといっても読む方にとっては当たり前のことかもしれません。 また、プロジェクトレイアウトはこれが正義だとは思っていません。紹介するレイアウトは業務では使っていないです。運用などもまともにしたことはありません。私がそこそこの規模のサーバーを新規で構築するならこんな風にしようかなって記事です。 気づき interface を満たすためのコードって VSCode で自動生成できたんだ よくおまじないとかファクトリー関数の戻り値とかで構造体が interface を満たしているかどうかを確認することがあるかと思います。 package main import "context"

    2023年の Go での気づきに思いを馳せて構築するオレオレ Go サーバープロジェクトレイアウト
  • Go言語のORMであるGORMをv1からv2へのマイグレーションした話 #LayerXテックアドカレ - LayerX エンジニアブログ

    こんにちは。バクラク請求書チームでエンジニアをしている赤羽です。 昨年の12月のLayerXにJOINしたので、今月でちょうど1年経ちました。 この記事は  LayerXテックアドカレ2023  25日目の記事です。 前回はsh_komine が「相互理解の重要性と、促進するためのワークショップのご紹介」を書いてくれました。次回は@yoheiよりポストされる予定なのでご期待ください。 GORMとは GORMはGo言語の人気のあるORM(Object Relational Mapping)ライブラリです。 データベース(テーブル)とGoの構造体のマッピングを簡単に行うことができます。シンプルな構文、多様なデータベースサポート、マイグレーション、トランザクション管理など、豊富な機能が提供されています。 柔軟なクエリビルダーも提供され、開発者に使いやすいORMライブラリとなっています GORMに

    Go言語のORMであるGORMをv1からv2へのマイグレーションした話 #LayerXテックアドカレ - LayerX エンジニアブログ
  • Go言語のAPIサーバーの冗長なエラーログを40%削減した話 #LayerXテックアドカレ - LayerX エンジニアブログ

    こんにちは。バクラク申請・経費精算エンジニアの@upamuneです。先週末は30kmのトレイルレースがありましたが、今週末はフルマラソンがあるので満身創痍です。 この記事はLayerXテックアドカレ2023の22日目の記事です。 私はなぜか3日分もテックアドカレに入れてしまったのですが、2回目の今回はAPIサーバーのエラーログを40%削減した話をします。 昨日は@tataneによるバクラクの Vue3 移行戦略と詰まったポイント #LayerXテックアドカレ - LayerX エンジニアブログでした。明日は@trsによる入社エントリーです!楽しみですね。 はじめに 弊社では基的にGo言語を利用してAPIサーバーを実装しています。エラーが発生したら、調査しやすいようにエラーログを出力して調査しやすくしていますが、1つのエラーに対して複数回の冗長なエラーログが出力されるという問題がありました

    Go言語のAPIサーバーの冗長なエラーログを40%削減した話 #LayerXテックアドカレ - LayerX エンジニアブログ
  • GitHub - bracesdev/errtrace: An alternative to stack traces for your Go errors

    You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert

    GitHub - bracesdev/errtrace: An alternative to stack traces for your Go errors