Introducing Earthly Cloud. Consistent, repeatable builds. Advanced caching for speed. Works with any CI. Get 6,000 build min/mth free! Learn more. Introducing Earthly Cloud. Consistent, Fast Builds, Any CI. Get 6,000 build min/mth free! Learn more.
![Effective Error Handling in Golang](https://cdn-ak-scissors.b.st-hatena.com/image/square/a4d0b4e76bb77721ab8afbae369ba531e225cd17/height=288;version=1;width=512/https%3A%2F%2Fearthly.dev%2Fblog%2Fgenerated%2Fassets%2Fimages%2Fgolang-errors%2Fheader-800-72aa2c1ef.jpg)
Overview errors.Join について パフォーマンスについて Practice まとめ Overview Go 1.20 から errors パッケージに導入された errors.Join は複数のエラーを詰め込んでも詰め込んだエラーそれぞれを Unwrap して取り出せる。 fmt.Errorf でも複数のエラーを wrap できるようになっている。 複数のエラーを wrap してもそれぞれ unwrap して取り出せるので Is 判定を使うことができる。 errors.Join について Go1.20 から導入された機能です。 pkg.go.dev 以下のフューチャーさんのブログで丁寧に解説されてますが、error のラップの方法がちょっと便利になる関数になります。 future-architect.github.io もともと hashcorp が go-multier
Package template implements data-driven templates for generating textual output. To generate HTML output, see html/template, which has the same interface as this package but automatically secures HTML output against certain attacks. Templates are executed by applying them to a data structure. Annotations in the template refer to elements of the data structure (typically a field of a struct or a ke
Go言語ではながらく公式のロガーとして log パッケージがありました。これは非常にシンプルなもので構造データをうまく表現できなかったりログレベルを分けるということができません。CLIで使うシンプルなインタラクションであればこれで十分なのですが、クラウド上のバックエンドで動かすサービスにとっては構造化ロギングやログレベルの出し分けは事実上必須であり、そのための機能は十分と言えませんでした。 これに対して様々なロガーが3rd party packageとして公開されてきましたが、一方で公式に導入されようとしているロガーもあります。それがslogです。まだ提案の段階ではありますが、現状で使える実装を触ってみたところかなり実用的な段階だなと感じたので、自分用の備忘録を兼ねてメモを残してみます。 サンプルコードはここにも置いてあります。 基本的な使い方 まず基本的な使い方を見てみます。ログ出力用に
俳句bot (nostr) nostr の日本リレーを監視し、投稿を 575 または 57577 判定し、引用でお知らせする。狙った俳句ではなく、天然物の俳句がマッチするとウケが良い。 Go で実装。内部では go-haiku を使って俳句を判定。監視は日本語の投稿が流れる日本のリレーをお借りしている。普通の Go アプリなので golan:1.20-alpine でビルドして scratch でイメージ作成。 # syntax=docker/dockerfile:1.4 FROM golang:1.20-alpine AS build-dev WORKDIR /go/src/app COPY --link go.mod go.sum ./ RUN apk add --no-cache upx || \ go version && \ go mod download COPY --link
こんにちは。カミナシ ソフトウェアエンジニアの @aoman です。 つい先日、Goで有名な@tenntennさんがConnpassで募集していたGopher塾#2に参加させていただきました。 tenntenn.connpass.com 大変勉強になりおすすめです!筆者が参加したのは第一回目ですが、二回目三回目と予定されているようなので、有料講義ではありますが気になる方はぜひ参加してみてください!学生さんであれば無料の抽選枠もあります。 その際に紹介されていたコードで、エラーのラップ関数があったのですが、これが「メッチャアタマイイ!!スタイリッシュ!!」と感動しました。そのコードは、Goの公式ページである https://go.dev/ のWebサイトを実装しているリポジトリ pkgsite 内の internal/derrors パッケージで実装されています(GitHubリポジトリはミラ
はじめに 2022年3月にリリースされたGo1.18ではジェネリクス(型パラメータ)が導入されました。長年楽しみされてきた機能で、少しずつGoの標準ライブラリでも使用され始めています。一方でリリース時に少し試してはみたものの、使いどころ所が難しいと思った読者の方も多いのではないでしょうか。この記事ではGoの標準ライブラリにおける利用例を紐解きながらジェネリクスへの理解を深めていきます。 timeパッケージ 日付と時刻の操作を扱うtimeパッケージでは内部的にジェネリクスが利用されています。JSONのシリアライズを行うMarshalJSONへのバリデーションの改善とジェネリクスの導入により、9%以上の高速化が成されました。では実装を見てみましょう。 timeパッケージのformat.goより func atoi[bytes []byte | string](s bytes) (x int,
logパッケージ Goには標準ライブラリとしてlogパッケージが提供されています。logパッケージで行えることはそう多くはありません。たとえば、デフォルトではログは標準エラー出力に出力されますが、log.SetOutput関数で出力先を変更できます。また、利用する関数によってログを出力した後の挙動をコントロールできます。たとえば、log.Print関数はログを出力するだけですが、log.Fatal関数はログ出力後にos.Exit(1)を呼び出します。log.Panicはログ出力後に出力したログと同じ文言を引数としてパニックを発生させます。 logパッケージでは、ログとともに関連するデータを出力したい場合は、log.Printf関数を用います。次のように、書式を指定して出力します。 log.Printf("request_url=%s request_method=%s", r.URL, r
Go1.18は2022年3月にリリースされました。このリリースはGo言語へのジェネリクスの実装を含んでいます。 この記事ではできるだけ最新の仕様と用語法にもとづいてジェネリクスの言語仕様について解説していきます。 更新履歴 2024/01/03: Go1.21(2023-08-08)でcmpパッケージが標準ライブラリに追加されたことに対応しました。 2023/02/23: Go1.20(2023-02-01)のcomparableの仕様変更に対応しました。 次の関連資料があります: The Go Blog - All your comparable types Griesemer氏によるGo公式ブログです。 Go言語のBasic Interfaceはcomparableを満たすようになる(でも実装するようにはならない) 上記の内容に対する筆者の解説記事です。Go1.20リリース前に書いたの
また毎回恒例のGo 1.17リリースパーティも開催予定です。ぜひご参加ください。 コンパイラ関数呼び出しが5%高速化1.16の時に予告されていたレジスタベースの関数呼び出しが入りました。呼び出し速度が5%、バイナリサイズが2%改善されました。特にコードの変更なく恩恵に授かれます。 あとはpanic時のスタックトレースの表示が改善され、今まで16進数で表示されていたのが改善されたらしいのですが、よくわかりませんでした。16進数は出なくなりましたが、試したが、…となるだけでした。 クロージャを含む関数がインライン展開されるようにもなりました。これもコード修正必要なく、パフォーマンスアップにつながる可能性があります。 なお、unsafeで怪しく引数を触ったりするとトラブルが発生する可能性がありますが、通常のGoの使用方法では問題になることはなさそうです。 build constraintのコメン
Go の database/sql パッケージ の DB 構造体 は、データベースへのコネクションプールを管理し、かつスレッドセーフ (goroutine セーフと言ったほうが良いのだろうか…?) にそれらの接続を使用できることを保証している。 ドキュメント にも次のように書かれている。 DB is a database handle representing a pool of zero or more underlying connections. It’s safe for concurrent use by multiple goroutines. こちらの基本的な実装内容と、動作を制御するパラメータについて調べてみた。 基礎知識のおさらい database/sql パッケージはデータストアの実装によらない一般的な SQL のインタフェースを提供している。具体的なデータストアへの接
Goには既存の型に新しい名前をつける方法が2つある。 type MyType intと宣言するDefined type 以前はNamed typeと言っていたが、Go1.11からDefined typeと呼ぶようになった type MyType = intと宣言するType alias すでにいろいろ記事はあるものの、最近数回聞かれることがあったので改めてまとめておく。 Tl;DR Goには型に違う名前をつける方法がある。 Defined typeとType alias Defined typeを使うと完全に違う型として扱える プリミティブな型に異なる型名をつけたり、メソッドを生やすこともできる Value Object的な型を簡単に作ることができる Go1.10以前(書籍プログラミング言語Goなど)ではNamed typeと呼ばれている Type aliasを使うと異なる名前だが同じ型と
Go 1.17 リリースに合わせて【バージョン 1.17 改訂版】とした(2021-08-21) Go 1.18 から追加・変更になった機能について追記した(2022-04-03) Go のモジュールについては自ブログでもよく話題にするのだが,差分情報が多く内容が分散しているため,ここの Zenn でまとめておく。なお,この記事では vendoring 機能については言及しないのであしからず[1]。 用語の整理 まず最初に用語の定義をしておく。 GOPATH モードとモジュール対応モード バージョン 1.11 以降から Go ツールーチェーンは以下の2つのモードのどちらかで動作する。 GOPATH モード (GOPATH mode) : バージョン 1.10 までのモード。標準ライブラリを除く全てのパッケージのコード管理とビルドを環境変数 GOPATH で指定されたディレクトリ下で行う。パ
Goのエラーハンドリングが採ったスタイル 多値返し 直積(関数の返値とエラーを両方返す) try-finallyをdeferという機構でカバー panicはプロセスを落とすためのもの Goはこの戦略でエラーハンドリングを行うとしましたので、「多値はなぜタプルじゃないんだ?」、「直和(返値orエラー)で十分じゃ?」「panic-recoverでtry-catchできそう?」などいう様な他の処理系の風習を持ち込むことは意味がありません。そしてそれらの提案の多くはすでに検討されリジェクトされてきた経緯があります。 「try組み込み関数」プロポーザルなんかも検討されマージ直前くらいまで進んだこともありますが、「Goのエラーハンドリング」にとって一長一短がありました。その欠点課題は解決できずに最終的にリジェクトされました。 「多値返し」は実にCPUフレンドリーな機構で、C言語の関数呼び出し規約にちょ
Goのプロジェクトをどの様なファイル構成で配置すれば良いか読み物が少ないという指摘を見たのでまとめてみようと思う。 GOPATHについて Go1.16がリリースされたことでGo-Moduleによるプロジェクト構成が標準で推奨されることになりました。(Go1.11までさかのぼってGo-Moduleは使える様になってます) Go-Moduleモードでは「GOPATH配下にプロジェクトを置かなければならない」という制約からは解放されています。なので、実質GOPATHはどこを指していても構わないし設定されていなくても「ユーザーホーム/go」というデフォルトの場所が決まっているので開発できます。 おすすめの環境変数設定は以下の2つだけ。 「GOPATH=~/.go」(WindowsはGOPATH=%USERPROFILE%\.go) 「PATH=$GOPATH/bin:$PATH」(Windowsは
DMM GroupのGoの勉強会「DMM.go」。DMM Groupのエンジニアが現場で培った技術やトレンドについて発表していきます。 2回目の開催となる今回登壇するのは、合同会社EXNOA プラットフォーム開発本部の PFシステム部に所属する岡崎翔悟氏。「Goとクリーンアーキテクチャ」の内容で、実際の現場にいるからわかるGoの開発やクリーンアーキテクチャについて話していきます。関連資料はこちら。 合同会社EXNOAとは 岡崎翔悟氏:今回「Goとクリーンアーキテクチャ」と題しまして、EXNOAの岡崎が発表いたします。 「EXNOAって何だ?」と思われた方が多数いらっしゃると思うので、まずはそちらの説明から。DMM GAMESは2020年4月10日付でEXNOAに社名を変更しました。ただし、一般作品のブランド名として「DMM GAMES」は残っています。一般作品の「DMM GAMES」とR1
Matt Pearring and Dmitri Shuralyov 16 February 2021 Today the Go team is very happy to announce the release of Go 1.16. You can get it from the download page. The new embed package provides access to files embedded at compile time using the new //go:embed directive. Now it is easy to bundle supporting data files into your Go programs, making developing with Go even smoother. You can get started us
VSCodeも1.53でInsiderでない安定板もM1対応になりますし、GoLandもネイティブ版がリリースされました。Rosetta2でも快適だった環境はますます快適になっています。 それ以外だとlinux/riscv64対応が改良されていて、個人的には気になっています。 ランタイムの変化runtime/metricsパッケージが導入されました。runtimeとかdebugとかさまざまな場所に散っていったメトリックス収集機能が集約されました。今サポートしているのはGC関連のメトリックスと、メモリ関連のメトリックス、goroutine数ですね。 あとは、GODEBUG環境変数にinittrace=1を設定すると、各パッケージのinitで消費している時間やメモリの情報が標準出力に表示されます。Google App EngineやらCloud RunやらCloud FunctionsやらAW
Goのテストについていくつかまとめを書いていた。 Goのtestを理解する in 2018 #go Goのtestを理解する in 2019 触れるのを忘れていたhttptestパッケージについてまとめる。 https://golang.org/pkg/net/http/httptest/ TL;DR net/http/httptestパッケージ https://golang.org/pkg/net/http/httptest/ net/http/httptestパッケージはサーバ/クライアント両方のHTTP周りのテストで使う サーバのHTTPハンドラーのテストを書くとき https://golang.org/pkg/net/http/httptest/#NewRequest https://golang.org/pkg/net/http/httptest/#NewRecorder ダミー
これはGo Advent Calendar 2018の14日目の記事となる。 この記事ではGoogleが提供するGoのDependency Injection(DI、依存性の注入)ツールであるWireを使ったDIの概要と、Wireで利用可能なDI関数の戻り値シグネチャのパターンを紹介する。 github.com/google/wire https://github.com/google/wire Compile-time Dependency Injection With Go Cloud’s Wire | The Go blog https://blog.golang.org/wire TL;DR WireコマンドはGoogle謹製のGoでDI(依存性の注入)を行なうツール https://github.com/google/wire 依存の注入・初期化、依存の注入・初期化を繰り返して多
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く