nilaway どんなもの? nil パニックによるランタイムエラーになる箇所を指摘してくれる静的解析ツール スタンドアロンで動く。golangci-lintで使用するにはカスタマイズが必要。 先行技術やツールと比べてどこがすごい? 標準パッケージに同梱されているnilness[1]ではチェックできないnil パニックとなりうる箇所を指摘する 関数やパッケージの境界を跨いでnilフローを追跡 nil インターフェース値を報告 例えば以下のコードでは、nilnessはエラーを報告してくれないが、nilawayはnilパニックを報告してくれる。 var p *P if someCondition { p = &P{} } print(p.f) // nilnessreports NOerror here, but nilaway does.技術のキモはどこ? Our main idea
はじめに 2024年8月13日、Go 1.23がリリースされ、ついにイテレータが利用可能となりました。 この記事では、Goのイテレータについて、 どうやって使うのか どこまで知っておく必要があるのか を理解することをゴールとします。 基本的な知識 基本的な知識としては、以下の内容を知っていれば問題ないです。 for文のrangeループの仕様が変わった 関数を対象にrangeループを回せるようになる rangeループの対象にできる種類の関数をイテレータと呼ぶ イテレータには3種類ある for文のrangeループの仕様が変わったGo 1.22までは、for文によるrangeループの対象にできたのは、配列, slice, 文字列,map, channel, 整数だけでした。Go 1.23で、ここに関数(ただし、特定の形式に限る)が加わりました。 ここで、rangeループの対象にできる形式の
こんにちは、エムスリーエンジニアリンググループの福林 (@fukubaya) です。golangでずっと課題に思っていたエラーの処理について試行錯誤してみました。イオンモール センソックシティは、カンボジアにある商業施設。本文には関係ありません。 エラー処理のベストプラクティスは? ぼくがかんがえるエラー処理の要件 検討したパッケージ 構造化ログ パッケージの検討 pkg/errorscockroachdb/errorsgoark/errsgo-errors/errorsgo-errors/errors がよさそう? pkg/errors やcockroachdb/errors は使えないのか ラップして使うerrors.WithStack(err) と呼びたい slogで使うerrors.Join() に対応したい まとめ We are hiring! エラー処理のベス
はじめに こんにちは。都内でソフトウェアエンジニアをしているtomoriです。 突然ですが、Go言語でHTTPサーバーを実装する際、サーバーの終了処理を適切に実装できている自信はありますか? 自分が開発に携わっているプロダクトでは、ほんの最近まで下記のような不適切な終了処理を行なっていました(話を簡単にするためにここでは panic を使っています)。err := http.ListenAndServe(":8080", handler) iferr != nil { panic(err) } HTTPサーバー実装のサンプルとかでよく見るやつですね。 これだとアプリケーション側で、いわゆる Graceful Shutdown ができておらず、実行環境にて不具合を引き起こす恐れがあります。 というわけで、最近それを修正したのでアウトプットとして記事にします。Go言語でHTTPサーバーを
すでにやったこと 真っ先に行うことといえば、写真や動画をクラウドに保存することだろう。 しかし、私の友達はMacbookくらいしかいないので、インスタ映えしそうな大量の写真や動画などはなかった。 ゴミ箱を空にする XCodeをアンインストール → 約10GB ローカルのDockerイメージを削除 → 約5GB ローカルのプロジェクトソースを削除 → 約5GB brew cleanup → 約2GB 普通であれば、このくらいでなんとかなると思うが、まだまだ足りない。 追加で必要な開発環境をいくつか構築すると、またすぐに詰んだ。go clean 以下の2つのコマンドでgoのキャッシュを削除することができる。
Go言語でテストを書く際のベストプラクティスとして、テーブル駆動テスト(Table dirven tests) というのが推奨されている。ようはデータとふるまいを分離しましょうという話で、正直わざわざ名前をつけるようなものでもなかろうという気持ちもないではないが、まあ話がはやくていいね。 けどみんなほんとにこれで満足してるの? と疑問に思うところはある。テストが落ちたときに表示される行番号がテストケースによらず一定で、どのテストが落ちたのかを探すのに一手間かかってしまう。 たとえば以下のコードをテストする際、 package eg import "testing" func TestExample(t *testing.T) { testcases := []struct { name string a, b int sum int }{ {"1+1", 1, 1, 99}, {"2+2"
普段Go書いているときにそこまで気にしてなかったが、ふと気になったので色々パターンを挙げてみる。なおこの記事には「答え」が書かれてないので、みなさんの意見を聞かせてください。 複数の引数を取るパターン一覧 そのまま引数を羅列する 複数の引数をまとめたstructを取る Functional Options Pattern そのまま引数を羅列する 例えばHTTPリクエストを行うような関数があったとして、 func Request(ctx context.Context, method http.Method, _url string, query url.Values, formValues url.Values)error { // do something } というシグネチャが考えられる。 実際にnet/http.NewRequsetWithContext は func NewReq
問題のある実装パターン 共通実装 以下のような applog パッケージ上のロガー実装を考えましょう。ここではGo 標準のlog.Logger をラップしていますが,様々な実装に拡張できることを想定しています。 package applog import ( "fmt" "log" "os" ) typeLogger interface { Info(message string)Error(message string) } func NewLogger()Logger { return &logger{ inner:log.New(os.Stdout, "",log.LstdFlags), } } var _Logger = (*logger)(nil) typelogger struct { inner *log.Logger } func (l *logger)
深さ優先探索と幅優先探索の概要 例えばニュースアプリでニュース一覧からとあるニュースを探しているとして、探し方は大きく分けて2つある。 (カテゴリタブとかはなくてニュースが羅列していて、そのニュースそれぞれが関連ニュースを複数保持している状態をイメージしてもらえれば良い) 深さ優先探索の概要 1つ目は、一覧にあるニュース記事から1つを選んで見て、その記事が探索している記事でなければそのニュース記事内の関連ニュース記事を1つ選んで見る。 その関連ニュース記事が探索している記事でなければ、さらにそのニュース記事内の関連ニュース記事を1つ選んで見る。 これを繰り返して、関連ニュース記事がなくなれば1つ前に探索した関連ニュース記事の中でまだ探索していない関連ニュース記事を探索する。 これを繰り返すと、一覧にあるニュース記事の全てを探索することができる。 深さ優先探索のイメージ このように深さ優先探
こんにちは。カミナシ ソフトウェアエンジニアのAomanです。 最近ちょこちょこアルゴリズムやデータ構造、Goのキャッチアップしています。 そんな中、go.devのブログGoblog のとある記事でダブルポインタを使用するコードに出会いました。筆者は今まで、RubyやJavaScript/TypeScriptなどの言語を多く触っていたためか、お恥ずかしながらダブルポインタを使うコードを初めて見たので「なんなのだこれは…」と戸惑いました。本記事ではそんなダブルポインタが使われていたコードについて、簡単にご紹介したいと思います。 そもそもダブルポインタとは? その名の通りポインタのポインタのことなのですが、わからない方は下記の記事がわかりやすくまとまっており参考になると思います。 daeudaeu.com ダブルポインタと聞いて、まずはじめに思った感想は「そんなもの必要?」です。今まで使っ
GraphQL における N+1 問題の解決の機構として Dataloder と呼ばれるものがあるが、Go でこれを行うときは gqlgen + graph-gophers/dataloader という組み合わせがよく使われるようだ。後者は gqlgen の公式ドキュメントからも参照されているので、gqlgen を使っていれば自然とそうなりそう。 このへんの話は 【GraphQL ×Go】 N+1問題を解決するgqlgen + dataloaderの実装方法とCacheの実装オプション - LayerXエンジニアブログ などに詳しい。 さて、この dataloaders ってのを普通に使ってコードを書いてみるとわかるのだけど、ロードのためのキーとして string を、ロードされた結果として interface{} を返すような実装になっている。つまり実際にデータベースにアクセスするよ
はじめに つい先日、HTTP3がRFC9114として正式に発表されました。 RFC読むよりとりあえずパケット見る派なので、とりあえずコード書いて動かしてキャプチャしたいところです。 quic-goは http3 ディレクトリがあり、対応してそうなのでサンプルコードを書いてみました。 数日前にcommitが入っていて開発も活発そうですね。 サンプルのサーバ側コードを試す時はお手数ですが、opensslやmkcertコマンドなどでご自分で公開鍵&秘密鍵を生成してください。 クライアント まずはクライアントのコードを書いてみます。go.docを見ると、RoundTrip という関数に *http.Request を渡すとHTTP3のクライアントコードになりそうです。 こんなコードになりました。 package main import ( "crypto/tls" "fmt" "github.c
はじめに とりあえずIT業界に入ったら読んでおけという名著はいろいろありますが、その中の1冊がマスタリングTCP/IP入門編でしょう。 僕も買ってはいたものの読むのを途中で挫折していたので、今回しっかり読んでTCP/IPを再勉強してみたいと思います。 マスタリングTCP/IPを読みながらその他わからんことはググりつつ、golangでTCPIPプロトコルそのものを自作してみます。 方針は以下のようにします。 ethernetから作る データのやり取りにnetパッケージは一切使わない (訂正、PCのIPやMacアドレスを取るのにだけ使用しますた) データのやり取りに使うのはsyscallのsendtoとrecvfromだけ socketはRAW_SOCKETを使うgolangやネットワークについても初心者の駆け出しですので間違えや実装ミス、変なコードがあるかもですが、生暖かい目でよろしゅうお
この記事はPySpa Advent Calendar 2021の14日目のエントリーとして書かれました。昨日のエントリーは冷凍食品でウキウキ引きこもり生活 でした。ちなみに私も70ℓの冷凍庫を購入しましたが本当にライフチェンジングでした。 総論: なぜログが必要か 可観測性 たとえ目的は自明でも、その動作までが自明なアプリケーションというものはほぼ存在しません。現実の世界のアプリケーションというものは、動作パラメータだったり実行環境だったり、起動時点でのさまざまな要因によって挙動を変えるものだからです。そして、そうしたアプリケーションにはライフサイクルというものがあります。ここでいうライフサイクルは、アプリケーションの処理が実行されるにつれ、アプリケーションの内外との情報のやりとりで生じる大局的な状態の変化のことです。アプリケーションが並行処理を行うようなものであれば、個々の並行処理の単位
Lorca+SvelteKitでやってみる! https://github.com/zserge/lorca https://github.com/sveltejs/kit あらかじめ必要なものgo(version 1.17.2以降) nodejs(16.9.0以降),npm(7.21.1以降)Chrome/Chromium/Edgeのいずれかプロジェクトの開始 mkdir sample-gui cd sample-guigo mod init sample-gui npm initsvelte@next frontend // Choice "Svelte apptemplate" is "Skelton Project". // Choice "UseTypeScript" is No. // Choice "ESLint" is No. // Choice "Prett
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く