タグ

goに関するxKxAxKxのブックマーク (4)

  • Go の iter パッケージを使ってみよう

    はじめに Go 1.23 で iter パッケージが導入されました。この iter は抽象化されたイテレータを示す仕組みと実装です。未だどの様に活用して良いか分からない方もいると思いますので、使い方を簡単に解説しようと思います。 概念 iter パッケージは、現状は for-range でのみ利用可能です。スコープにコンテキストを持ったロジカルな列挙可能オブジェクトと、それを別のスコープにて for-range でイテレートする際に便利です。 これまでであれば、こういった実装は goroutine と channel を使いスコープを分割させる事で実装してきました。 package main func iter1[T any](a []T) func() (T, bool) { ch := make(chan T) go func() { defer close(ch) for _, v

    Go の iter パッケージを使ってみよう
    xKxAxKx
    xKxAxKx 2024/08/22
  • デザインパターンを Go で

    複雑なオブジェクトを段階的に構築できます。 このパターンを使用すると、 同じ構築コードを使用して異なる型と表現のオブジェクトを生成することが可能です。

  • sync.ErrGroupで複数のgoroutineを制御する

    Golangの並行処理は強力である一方で同期処理を慎重に実装する必要がある.“Go 言語における並行処理の構築部材”にまとめられているようにGolangは様々な方法でそれを実装することができる.実現したいタスクに合わせてこれらを適切に選択する必要がある. この同期処理の機構として新たにgolang.org/x/sync/errgroupというパッケージが登場した.実際に自分のツールで使ってみて便利だったので簡単に紹介する. 使いどころ 時間のかかる1つのタスクを複数のサブタスクとして並行実行しそれらが全て終了するのを待ち合わせる処理(Latch)を書きたい場合にerrgroupは使える.その中でも「1つでもサブタスクでエラーが発生した場合に他のサブタスクを全てを終了しエラーを返したい」(複数のサブタスクが全て正常に終了して初めて1つの処理として完結する)場合が主な使いどころである. 実例

    xKxAxKx
    xKxAxKx 2021/05/13
  • 【errorgroup】並行処理中にエラーハンドリングをする場合の注意点【Golang】 - Qiita

    概要 Golangの並行処理をしつつerrorハンドリングをしたい場合は、errorgroupパッケージを使うことができます。 GoDocはこちら https://godoc.org/golang.org/x/sync/errgroup とりあえず実装してみる(期待していない値が返ってくる例) import "golang.org/x/sync/errgroup" var g errgroup.Group for _, url := range urls { g.Go(func() error { // Fetch the URL. resp, err := http.Get(url) if err == nil { resp.Body.Close() } return err }) } こんな感じで書くと、urlsの末尾の要素のみ参照してしまい、期待通りに動作しません。なぜなのか。 Go

    【errorgroup】並行処理中にエラーハンドリングをする場合の注意点【Golang】 - Qiita
    xKxAxKx
    xKxAxKx 2021/05/13
  • 1