タグ

Goとgolangに関するW53SAのブックマーク (55)

  • Go1.21 New Features

    Go1.21 が 2023年8月9日(JST) にリリースされ、そのリリースノートやブログが公開されています。この記事では前回の Go1.20 New Features に引き続き、Go1.21 の新機能の中から気になった機能を解説していきます。 spec Go1.20 までは、メジャーリリースの一番最初のバージョンの末尾にパッチバージョンが付いておらず、次のバージョンからはパッチバージョンが付くようになっていました。 例えば Go1.20 の最初のバージョンは go1.20 で、次のバージョンからは go1.20.1, go1.20.2, ... のようにパッチバージョンがついていました。 Go1.21 からは、一番最初のバージョンが go1.21.0 のようにパッチバージョンの .0 が付くようになります。 import している package を初期化する順序が Spec に明記さ

    Go1.21 New Features
  • 【Go】time.Time.AddDateの注意点と対策 - Mirrativ Tech Blog

    こんにちは、バックエンドエンジニアの藤井脩紀です。 今回の記事では日付計算に潜む罠についてお話しさせていただきます。 なお今回はGoでの事例をご紹介しますが、原理的には他の言語やライブラリでも同様の事象が発生する可能性があります点にご注意ください。 time.Time.AddDateの注意点 突然ですがここでクイズです。 来月が何月か知りたいので以下のようなコードを書きました。 このコードを実行したのは10月だとします。 結果は何になるでしょう? // AddDateの引数は順に年、月、日でそれらの値を加算したtime.Timeを返してくれます fmt.Printf("%d月\n", time.Now().AddDate(0, 1, 0).Month()) 「え、11月でしょ?」と思う方もいらっしゃるかもしれませんが正確には異なります。 焦らさずに書きますが答えは「11月か12月のどちらか

    【Go】time.Time.AddDateの注意点と対策 - Mirrativ Tech Blog
  • 「Go net/http タイムアウト」の完全ガイド

    GoでHTTPサーバーまたはクライアントを書くとき、タイムアウトは、最も間違えやすく、そして最も軽微な間違えです。選択する対象が数多くあり、間違えても、ネットワークの不具合やプロセスがハングアップするまで、長い間、何の影響もありません。 HTTPは複雑な多段階プロトコルであるため、タイムアウトには万能な解決策はありません。ストリーミングエンドポイントと JSON API とCometエンドポイントを考えてみてください。確かに、デフォルトは多くの場合、あなたが望むものではありません。 この記事では、お客様がタイムアウトを適用する必要があるかもしれないさまざまな段階を取り出し、サーバーとクライアント側の両方で、これを行う色々な方法を見ていきます。 SetDeadlineまず、タイムアウトを実装するためにGoが公開するネットワークプリミティブの「期限」について知る必要があります。 net.Con

  • Goのnet/httpのtimeoutについて - Carpe Diem

    概要 タイムアウトと一口に言ってもサーバ・クライアント、そして各フェーズによって細かく設定があります。 今回はGonet/httpのtimeoutについて1つ1つ説明していきます。 環境 golang/go 1.13 Server 全体図 サーバ系timeoutと各フェーズは以下の関係になっています。 各項目 項目 役割 http.Server.ReadHeaderTimeout request headersを読む際のtimeout http.Server.ReadTimeout request headersやrequest bodyを読む際のtimeout。 SetReadDeadline()を呼び出してセットする。 http.Server.WriteTimeout request bodyの読み込み〜responseの書き込みまで。 SetWriteDeadline()を呼び出し

    Goのnet/httpのtimeoutについて - Carpe Diem
  • ActivityPub サーバー、honk をカスタマイズしてみる | Coelacanth's Dream

    ActivityPub サーバー、honk をカスタマイズしてみる 最近の Twitter の情勢を受けて、他の SNS、特に Mastodon サーバーに移行または独自のサーバーを構築する人が増えている。 加えて自分の観測範囲では、以前に紹介した Ted Unangst 氏による Go言語製の ActivityPub サーバーの最小実装、honk を構築する人が増えている。1 honk は省メモリであるため、メモリ 512MB の VPS でも快適に動作する。 メインでも予備でも、個人で運用可能な ActivityPub サーバーが欲しい人にとって honk は有力な選択肢になると思う。 また、最小実装ということが手伝い、カスタマイズ、それによる再ビルドと再起動に必要とするコストは小さく、バイナリサイズも自分が運用しているもので 13M と小さい。 そこで、個人的に honk を運用しな

    ActivityPub サーバー、honk をカスタマイズしてみる | Coelacanth's Dream
  • GoConで発表してきたのでついでにruntime以下の知識をまとめていく #golang #goroutine - niconegoto Blog

    3/25に行われたGoConで"How Communicating Sequential Goroutines Work"という発表をしてきました。 当初僕はCommunicating Sequential Processesについての話しをする予定だったのですが、時間内にとても発表できそうな内容ではなかったため、Concurrency全般についての話をしました。 そのため、ここではその際触れられなかったgoroutineの実装の話しやCSPの話しなどを含めてGoのruntimeについて何回かに分けてまとめていきたいと思います。今回は主にgoroutineについてです。 GoのConcurrency goroutineの説明に入る前にざっくりGoのConcurrencyについて説明します。 以下、GoConでの発表スライドにざっくりと沿いながら書いていきます。 speakerdeck.co

    GoConで発表してきたのでついでにruntime以下の知識をまとめていく #golang #goroutine - niconegoto Blog
  • 【Golang】Exit, panic, Goexitの違い

    はじめに 記事におけるGoのバージョンは1.11.5です。 関数定義 3つの関数定義を、パッケージとともに表示すると以下のようになります。 func os.Exit(code int) func builtin.panic(v interface{}) func runtime.Goexit() 3つの違い ざっくり言うと、上のほうが過激で、下のほうが穏やかです。 os.Exit 引数の整数は終了コードです。今回は例外的な事態が発生した場合を考えているので、終了コードとしては0以外を考えています。 プログラムの中でos.Exit(0以外)が呼ばれると、以下のような挙動をとります。 プログラムは直ちに終了する。 deferされた関数は呼ばれない。 builtin.panic 引数にはログ出力したい文字列等を指定します。したがってこんな使い方をすることが多いと思います(builtinパッケー

    【Golang】Exit, panic, Goexitの違い
  • Goでの並行処理を徹底解剖!

    並行処理をうまく使うのは難易度が高めです。 それゆえに、go文とチャネルについて基的な文法書で知った後「並行処理ちゃんとできる!」の段階まで自力でたどり着くのは大変でしょう。 このは、 *「並行処理ってやって何が嬉しいの?」 *「ゴールーチンとかチャネルとかって一体何者?」 *「ゴールーチンやチャネルを使ったうまいコードの書き方が知りたい!」 *「Goランタイムで並行処理をどううまく処理しているか知りたい!」 といった要望にお答えする、「Goでの並行処理」に関連した事柄について網羅的・徹底的に書きまくったものです。

    Goでの並行処理を徹底解剖!
  • Go Generics で実装する Y コンビネータ、再帰関数を汎用的にメモ化する - アルパカの徒然文

    先日面白い記事を読んだ。The Y combinator in Go with generics である。 一番最初目に入ってきたのは難解なジェネリクスのコードである。 type Func[T, U any] func(T) U type TagFunc[T, U any] func(Func[T, U]) Func[T, U] type CombinatorFunc[T, U any] func(CombinatorFunc[T, U]) Func[T, U] func Y[T, U any](f TagFunc[T, U]) Func[T, U] { return func(self CombinatorFunc[T, U]) Func[T, U] { return f(func(n T) U { return self(self)(n) }) }(func(self Combinat

    Go Generics で実装する Y コンビネータ、再帰関数を汎用的にメモ化する - アルパカの徒然文
  • 作ってわかる! はじめてのgRPC

    gRPCは主にバックエンド、特にマイクロサービス同士の通信に多く使われる通信方式です。 しかしそれゆえに知名度が低く、「gRPCってどんな通信なんだろう?」「HTTPとは別の仕組みなの?」と思っている方もたくさんいるのではないでしょうか。 このでは、gRPCはそもそもどんなコンセプトで作られた通信方式なのかから、Goでの具体的な実装ノウハウ、AWSにデプロイするための設定までを通貫して解説することで、 「gRPC全くわからない」という人が「自分で実装して動かせそうな気がする……!」と思える段階までたどり着けるようにしました。

    作ってわかる! はじめてのgRPC
  • Go 言語製実行ファイル解析の紹介 - FFRIエンジニアブログ

    はじめに セキュリティエンジニアの桑原です。 プログラミング言語には様々なものがあります。 その中でも近年 Go 言語がシンプルなコードであり並行処理を簡単に書けるという特徴から人気が出ています。 しかしながら、マルウェアの作成者も Go 言語に目をつけはじめました。 その結果、WellMess や TellYouThePass といった Go 言語製のマルウェアが出現しています。 こうした Go 言語製の実行ファイルは C 言語等で作成された実行ファイルと異なる点が多く、それを知らずに解析を始めると戸惑うことがあります。 そこでブログでは、Go 言語で解説用に作成した無害な実行ファイルの解析を通して、その特徴を紹介します。 以下は今回使用したツールと環境です。 Windows 10 x64 20H2 Ghidra 10.1.1 x64dbg Mar 16 2021, 01:13:24

    Go 言語製実行ファイル解析の紹介 - FFRIエンジニアブログ
  • Go: selectでctx.Done()を受信するときの注意点 - castaneaiのブログ

    Goで非同期的な処理の中断を検知したい場合、次のように select と ctx.Done() を使って書くことが多い。 とても便利なパターンなのだが、いくつか使うときの注意点がある。 select { case <-ctx.Done(): // done case <-ch: // ... } selectによる受信のランダム性 channelに届いたタスクを順番に処理しつつ、キャンセル要求が来たら終了する簡単なプログラムを例にする。 コードにある通り次のような順序で実行される。 task1を送る キャンセル要求を送る task2を送る package main import ( "context" "log" "time" ) func main() { ctx, cancel := context.WithCancel(context.Background()) tasks := m

    Go: selectでctx.Done()を受信するときの注意点 - castaneaiのブログ
  • Goのmonorepoとworkspace mode - Qiita

    僕はmonorepoが好きで、これまでGoのsingle-module構成とmulti-module構成どちらも実運用してきました。最近ではメルカリShopsがmonorepoを採用して話題になったりとにわかに盛り上がっていて嬉しくあります。 https://engineering.mercari.com/blog/entry/20210817-8f561697cc/ さて、来たるGo 1.18の目玉はやはりGenericsで影に隠れがちですが、multi-moduleの体験を向上させるworkspace modeという機能が入る予定です。 https://github.com/golang/go/issues/45713 この記事ではGoでmonorepoするときの一般的な構成であるsingle-moduleとmulti-module、そしてworkspace modeが入ったあとの世界

    Goのmonorepoとworkspace mode - Qiita
  • strings.Cut と strings.SplitN はどっちが速いか

    はじめに Go の tip に strings.Cut が入ったのでベンチマークを取った。ちなみに strings.Cut は lhs, rhs, ok := strings.Cut("FooBarBaz", "Bar") // lhs: Foo // rhs: Baz // ok: true package main_test import ( "strings" "testing" ) func BenchmarkCut(b *testing.B) { s := "FooBarBaz" b.ResetTimer() for i := 0; i < b.N; i++ { lhs, rhs, ok := strings.Cut(s, "Bar") if !ok || lhs != "Foo" || rhs != "Baz" { b.Fatal("bad!") } } } func Benc

    strings.Cut と strings.SplitN はどっちが速いか
  • Middleware Patterns in Go

    Middleware Patterns in GoHow to do pre and post-processing on all requests Last edited on Oct 23, 2021 by Dave Stearns So far you've seen how to build a Go web server that routes requests to different functions depending on the requested URL. But what if you want execute some code before and after every request, regardless of the requested URL? For example, what if you wanted to log all requests m

    Middleware Patterns in Go
  • HTTP Middleware の作り方と使い方 - 技術メモ

    こちらは Making and Using HTTP Middleware の日語訳です。 HTTP Middleware の作り方と使い方 ウェブアプリケーションを構築しているときに、多くの(あるいはすべての)HTTPリクエストに対して実行したい共通機能があるかもしれません。すべてのリクエストをログに記録したり、すべてのレスポンスを gzip したり、重い処理を行う前にキャッシュをチェックしたりしたいと思うかもしれません。 このような共通機能を整理する一つの方法として、ミドルウェアを設定することがあります。Go では、HTTP リクエストの制御の流れが以下のようになるように、ServeMux とアプリケーションハンドラの間でミドルウェアを使用するのが一般的です。 ServeMux => Middleware Handler => Application Handler 今回は、このパタ

    HTTP Middleware の作り方と使い方 - 技術メモ
  • GoでJSTのタイムゾーンを扱う方法 - 技術メモ

    記事はGoでJSTのタイムゾーンを指定する方法を紹介します。 *time.Location の取得方法 タイムゾーンを指定して時刻を取得する方法 方法1.時刻をパースする際に In でロケーションを指定する 方法2. time パッケージが保持しているグローバル変数を更新する 方法1'.ロケーション付で時刻が取得できる関数を生成 文字列から time.Time に変換する方法 まとめ 現在時刻を取得するには time.Now() を使うことになります。time.Now() はデフォルトではローカルな時刻が取得できます。例えばAWS Lambda上ではUTCの時刻が取得できます。日のロケーションで動作するアプリケーションを前提にすると、アプリケーションによっては時刻をJSTで統一したほうがシンプルで扱いやすい、といったケースもあるでしょう。記事ではGoのアプリケーションでJSTの時刻を

    GoでJSTのタイムゾーンを扱う方法 - 技術メモ
  • The Go init Function

  • init関数のふしぎ #golang - Qiita

    はじめに 知られているようで、案外知られてないことをQiitaに投稿していくのも良いと思い、軽いネタですがinit関数についてまとめたいと思います。 init関数とは init関数は特殊な関数で、パッケージの初期化に使われます。 以下のようにmainパッケージに書くとmain関数より先に実行されます。 mainパッケージでない場合は、importするだけで呼び出されます。 package main import ( "fmt" ) func init() { fmt.Println("hello, init") } func main() { fmt.Println("Hello, main") } Playgroundで動かす init関数は何に使うのか? 上記では、初期化に使うと書きました。名前からしてそれは想像できますよね。 init関数は基的にはパッケージ変数の初期化に用いられま

    init関数のふしぎ #golang - Qiita
  • テスト駆動開発でGO言語を学びましょう | テスト駆動開発でGO言語を学びましょう

    **テスト駆動開発(TDD)で基礎を身につけましょう。**GoはTDDを学習するのに適した言語です。なぜなら、学習するのが簡単な言語であり、テストが組み込まれているからです。

    テスト駆動開発でGO言語を学びましょう | テスト駆動開発でGO言語を学びましょう