Go

[Golang]sync.Mutexでスレッドセーフにする

Golang

 

複数のgoroutineでgocsv.Marshalによる競合を防ぐ

 

var gocsvMutex sync.Mutex // グローバルスコープで gocsv の操作を保護するためのミューテックス

func (c *CSVProcessor[T]) MarshalWithWriteHeader(w io.Writer, csvData interface{}, charset string, writeHeader bool) error {
	// エラーを捕捉するためのチャネル
	errChan := make(chan error, 1)

	go func() {
		if c.translator.CurrentLocale() != model.LocaleJa {
			cleanup := c.SetUpTranslatedHeaderNormalizer()
			defer cleanup()
		}

		gocsvMutex.Lock() // gocsv のスレッドセーフを保証
		defer gocsvMutex.Unlock()

		var err error
		if writeHeader {
			err = gocsv.Marshal(csvData, encoding.NewWriter(w, charset))
		} else {
			// BOMは最初だけ必要なので、途中からはBOMなしにする
			if charset == "UTF-8_BOM" {
				charset = "UTF-8"
			}
			err = gocsv.MarshalWithoutHeaders(csvData, encoding.NewWriter(w, charset))
		}

		// エラーがあればチャネルで通知
		if err != nil {
			errChan <- err
			return
		}
		close(errChan) // エラーがなければチャネルを閉じる
	}()

	// ゴルーチン内でのエラーを受け取る
	if err := <-errChan; err != nil {
		return err
	}

	return nil
}

 

 

 

 

 

Amazonおすすめ

iPad 9世代 2021年最新作

iPad 9世代出たから買い替え。安いぞ!🐱 初めてならiPad。Kindleを外で見るならiPad mini。ほとんどの人には通常のiPadをおすすめします><

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)