タグ

golangに関するdmizuno55のブックマーク (120)

  • About golang mongo driver CountDocuments

  • GoのロギングライブラリzapのTips - Carpe Diem

    概要 zapを使っていて 書き込み先をio.Writerで自由に設定したい テストで時刻を固定値にしたい ログレベルによって標準出力、標準エラー出力を分けたい GCP Cloud Loggingのフォーマットでログ出力したい 全ログに付けたいフィールドがある 独自logパッケージでラップしたらcallerがおかしい とちょっとカスタマイズしたいケースのTipsです。 環境 Go 1.17 go.uber.org/zap v1.19.1 Tips 書き込み先をio.Writerで自由に設定したい zapのデフォルトの出力先は標準エラー出力ですが、期待通りのフォーマットでログが出力されているか確認したい時にio.Writerを渡してそこに書き込んでほしい場合です。 そんなときはzapcore.AddSyncを使います。 func NewWithWriter(w io.Writer) *zap.

    GoのロギングライブラリzapのTips - Carpe Diem
  • Golang でスマートに標準出力テストを行う

    Golang で標準出力テストの方法の調査 最近Golangで標準出力をテストする際にどのような方法を取れば良いのか情報も少なく、しばらく迷走していたので、ここで一旦メモとしてまとめておく。 標準出力をテストする方法を模索した結果 今回調査した方法は主に以下の2つ os.Pipe() を駆使して出力先を切り替えて値をキャプチャする Testable Examples を利用する os.Pipe() を駆使して出力先を切り替えて値をキャプチャする まず初めに、標準出力を受け取る関数を定義して、出力先を切り替えて値をキャプチャする方法が妥当であろうと考え、以下のような共通関数を定義して呼び出すことにしました。 func PickStdout(t *testing.T, fnc func()) string { t.Helper() backup := os.Stdout defer func(

    Golang でスマートに標準出力テストを行う
  • golang の channel を使って Dispatcher-Worker を作り goroutine 爆発させないようにする - at kaneshin

    golang で処理の高速化をするために goroutine/channel を使って並行処理にし、待ち時間を無駄にしないようにするのは言葉で表すのは簡単ですが、実際にパターンとして落としこむためには経験が必要だなと思うので、今回 Dispatcher-Worker として Job Queue を golang で実装する方法を紹介したいと思います。 この記事は mattn さんの Big Sky :: golang の channel を使ったテクニックあれこれ の次のステップとして読むことをオススメします。 mattn.kaoriya.net golang で作成したアプリケーションで多くのリクエストをアプリケーションが送受信する必要がある場合、高速に捌くために並行処理にして非同期化を図る場合を想定しています。 今回は get という関数でHTTPリクエストを実行して取得したデータのサ

    golang の channel を使って Dispatcher-Worker を作り goroutine 爆発させないようにする - at kaneshin
  • go test におけるキャッシュの消し方

    go test のキャッシュを消すのは簡単$ go clean -testcache 以上です! $ go test ./... ok github.com/oxequa/realize (cached) ok github.com/oxequa/realize/realize (cached) このように (cached) となっていたものが、、、 $ go clean -testcache $ go test ./... ok github.com/oxequa/realize 0.086s ok github.com/oxequa/realize/realize 0.389s このように、実行時間が表示されており、キャッシュが消えていることが分かりますね。 ちなみに、キャッシュを無視する方法はもうひとつあり、 以下のように -count=1 をつけてやればOKです。 $ go tes

  • Go 言語 testing チートシート - Qiita

    はじめに このページでは testing パッケージの詳しい Example をチートシートとしてまとめました。 ご案内 このページの内容を別サイトにまとめなおしました。 目的別に項目を分けたのでやりたいことからコードを逆引きできます。 また、サイト上でコードを即時実行できるように The Go Playground の実行フォームを埋め込んだので、気軽にコードをお試しいただけます。 目次 関数のテストを書く テストを実行する メソッドのテストをする テスト失敗時にテストを継続する・テストを即時終了する 複数のテストデータでテストする テストを階層化する テストの開始終了処理を行う パッケージ単位でテストの開始終了処理を行う 別ファイルのテストデータを読み込む 入出力を持つ関数のテストをする HTTP ハンドラーをテストする HTTP サーバーをテストする テストファイルを作成する テスト

    Go 言語 testing チートシート - Qiita
  • Golangのnil sliceとnil map - 技術メモ

    nil sliceとempty sliceの違い nil sliceと空のsliceとは同じではないが、外から観測できる振る舞い(機能)は同じ len()もcap()もともに0を返す package main import "fmt" func main() { var s1 []int s2 := []int{} s3 := make([]int, 0) s34= nil fmt.Println("s1", len(s1), cap(s1), s1 == nil, s1[:], s1[:] == nil) fmt.Println("s2", len(s2), cap(s2), s2 == nil, s2[:], s2[:] == nil) fmt.Println("s3", len(s3), cap(s3), s3 == nil, s3[:], s3[:] == nil) for ran

    Golangのnil sliceとnil map - 技術メモ
  • Goのテストに入門してみよう! | フューチャー技術ブログ

    2020/08/15更新: 「テストの失敗をレポートしたい」と「サブテストの一部のみ実施したい」の章を追加 はじめにTIG の辻です。今回は春の入門祭りということで Go のテストに入門してみよう!という記事です。 書いた背景ですが Go の標準ライブラリのコードリーディング会で testing パッケージにチャレンジしてみましたが、難しすぎてわからん。そもそも Go のテストって何ができるんだっけ?という話になり、基的な内容をなるべく具体例をまじえながらまとめました。 ざっとどんなことができるんだろう、という index になれば幸いです。 TipsGo に組み込まれているテストの仕組みの中に、ベンチマークに関するテストと Example テストというサンプルコード用のテストも含まれているのですが、この 2 つは対象外にします。基礎的と思われる内容から順に並べてみました。 はじめに T

    Goのテストに入門してみよう! | フューチャー技術ブログ
  • Go言語でJSONファイルをMongoDBへ挿入!並行処理でデータ挿入を効率化

    事前準備 まずは、mongo-db-driverをインストールしましょう。 $GOPATH配下へインストールするか、Go 1.11以降に導入されたGo Modulesという仕組みを使って、プロジェクト毎のライブラリバージョン管理をするか選択してください。 # GOPATH配下へインストール go get go.mongodb.org/mongo-driver/mongo # Go Modules export GO111MODULE=on go mod init github.com/$user_name/$repository_name go get go.mongodb.org/mongo-driver/mongo 実装 それでは実際のコードを見ていきましょう。 1. MongoDBとの接続クライアント実装 package main import ( "context" "fmt" "

    Go言語でJSONファイルをMongoDBへ挿入!並行処理でデータ挿入を効率化
  • 6年間におけるGoのベストプラクティス | POSTD

    稿は、QCon London 2016で行った講演の内容に基づいています。スライドとビデオは近日中に掲載予定です) 2014年に開催された最初のGopherConで、私は「 Best Practices in Production Environments(番環境でのベストプラクティス) 」と題した講演を行いました。 SoundCloud の私たちはGoのアーリーアダプターで、その時点までに既に2年近く、番環境向けの様々なGoコードを書き、実行し、メンテナンスしていました。そして私たちはいくつかのことを学んだので、その教訓をまとめ、多くの人に伝えたいと思ったのです。 それ以来、私はフルタイムでGoを使う仕事を続けています。SoundCloudではその後の活動やインフラチームで、そして現在は Weaveworks で Weave Scope や Weave Mesh の開発に使ってい

    6年間におけるGoのベストプラクティス | POSTD
  • Go の Slice の落とし穴 - Qiita

    Go の Slice には落とし穴があります。 これは、 Slice 特有の、参照データ型のようでありながら完全な参照とも言い切れない、少し変わった挙動に由来します。 Slice を関数に渡し、その関数内で変更した場合 Arrayと対比することで挙動がわかりやすくなるので、まず、Arrayについて見てみます。 次のようなコードを実行してみます。 package main import "fmt" func main() { var a [5]int // array for i := 0; i < 5; i++ { a[i] = i } fmt.Printf("1. a: %v\n", a) modifyArray(a) fmt.Printf("3. a: %v\n", a) } func modifyArray(a [5]int) { a[2] = 9 fmt.Printf("2. a:

    Go の Slice の落とし穴 - Qiita
  • 今goのエラーハンドリングを無難にしておく方法(2021.09現在)

    2021年7月現在、goでエラーハンドリングってどうやって扱うのが無難なのかについて、いろいろと調べました。 昔から人気な pkg/errors、Go公式がメンテナンスしていたxerrors、 go v1.13から追加されたfmt.Errorfなどエラーハンドリングの選択肢がいろいろとあるので、stacktrace欲しい場合とそうでない場合で個人的にベストだと思った方法をまとめました。 エラーハンドリングに求める要件 エラーが発生した箇所を追える エラーの原因によって処理を分岐する (場合による)stacktraceがみれる 結論 stacktraceが不要な場合 fmt.Errorfでラップし、errors.Isで判定する stacktraceが必要な場合 pkg/errors.Wrapでラップし、pkg/errors.Causeで判定する log.Printf("%+v", err)で

    今goのエラーハンドリングを無難にしておく方法(2021.09現在)
  • 原理原則から適切なgoroutineの数を考える

    概要 動機 goroutineを使ってパフォーマンスを改善する際に、どれくらの数で並行処理すればいいのか分かりませんでした。そこで、そもそもどのような仕組みなのか調べ、どのような性質の仕事が改善されるのか計測して、適切な数を決めるための観点を整理しました。 要約 goroutineはカーネルスレッドとM:Nの関係になっています。そしてカーネルスレッドごとにgoroutineのキューがあり、Goのスケジューラが順次実行していきます。 IO-Boundな処理は、netpollerが別のカーネルスレッドで非同期でシステムコールを実行するので他のgoroutineをブロックしないようになっています。 goroutineの使用時には以下の観点を留意する必要が計測から分かりました。 goroutineを使う場合はコンテキストスイッチのコストとトレードオフになる CPU-Boundなgoroutineは

    原理原則から適切なgoroutineの数を考える
  • Go言語でCPU数に応じて並列処理数を制限する

    負荷のかかる処理を制限なしに並列化しても意味ない.処理の並列数を予測可能な場合は,当たりをつけて最適化するのもよいが,不明確な場合は,CPU数による制限が単純な1つの解になる. TL;DR CPU数に応じたバッファ長のChannelを使ってセマフォを実装する. 実例 mitchellh/gox goxはGo言語製のツールを並列コンパイルするツール.コンパイルの処理は重いため,デフォルトで並列処理数をCPU数で制限している. 簡単な例 例えば,以下のような単純な並列処理を考える.heavy()(重い処理)を並列で実行する. package main import ( "fmt" "sync" "time" ) func heavy(i int) { fmt.Println(i) time.Sleep(5 * time.Second) } func main() { var wg sync.W

  • 複数のGoroutineをWaitGroup(ErrGroup)で制御する

    この記事はGo7 Advent Calendar 2019五日目の記事です。 やりたいこと下記のように直列で動作し実行時間の長いGoのプログラムを、並行処理に変えて処理を効率化させます。 package main import ( "fmt" "time" ) func main() { for i := 0; i < 100; i++ { time.Sleep(2 * time.Second) // 長い処理 fmt.Println("End:", i) } }

    複数のGoroutineをWaitGroup(ErrGroup)で制御する
  • Big Sky :: Go 言語の非同期パターン

    Gogoroutine という非同期の仕組みを提供していますが、使い方次第では色々なパターンが実装できる為、初めて goroutine を見た人はどの様な物が正解なのか分からない事があります。以前、このブログでも紹介した事がありますが Go の非同期の仕組みは一見単純な様に見えて実はとても奥深いのです。 Big Sky :: golang の channel を使ったテクニックあれこれ golang の channel は他の言語に見ない独特のパラダイムを開発者に提供します。 単純にスレッド間でメッセージングをするだけでもC言語で書けばそこそこの量になったり、慣れていない人であればど... https://mattn.kaoriya.net/software/lang/go/20160706165757.htm 2012 年に Rob Pike 氏が Google I/O で「Go

    Big Sky :: Go 言語の非同期パターン
  • Goのgoroutine, channelをちょっと攻略! - Qiita

    Gogoroutine, channelがわからない マルチスレッドってなんやねん! go ステートメントってなんやねん! <- なんやねんこれ!意味不明 これをやりましょう → Go by Example やっていれば、なんとなくわかってくる。かも 以下は Go by Exampleを少し変更を加えて実行した例です。 Goroutineとは Tour of go によると goroutine (ゴルーチン)は、Goのランタイムに管理される軽量なスレッドです。 まず、スレッドがちゃんと理解してない スレッド:一連のプログラムの流れ シングルスレッド:1つのスレッドだけからなるプログラム マルチスレッド:1つのプログラムで複数のスレッドを同時に実行する マルチスレッド最強やんけ!ずっとこれ使えば小早川セナじゃん! → 実際には、しっかり理解して使わないとパフォーマンスが低下したり、デッドロ

    Goのgoroutine, channelをちょっと攻略! - Qiita
    dmizuno55
    dmizuno55 2022/02/20
    “マルチスレッドはこんなときに使う”
  • ポインタを図で理解する - Carpe Diem

    概要 Goのポインタを図で理解することで ダブルポインタとは Goは全て値渡し ポインタレシーバと値レシーバの違い がどういうことかを理解でき、参照渡しの時に x = y だと更新されず *x = *y だと更新される理由が分かります。 ポインタを図示する ポインタはメモリアドレスを指すというは理解しているでしょうが、ポインタ変数との関係を分かりやすくするために図示します。 func main() { var x = 100 fmt.Println("x address:\t", &x) var y *int fmt.Println("y value:\t", y) fmt.Println("y address:\t", &y) y = &x fmt.Println("y value:\t", y) fmt.Println("y address:\t", &y) } The Go Play

    ポインタを図で理解する - Carpe Diem
  • Go and a Package Focused Design

    Developers often tend to think about designing software in terms of using logical layers of abstractions. I have seen many Go projects with layers of abstractions that reflect grouping of all common things together such as types (model), handlers for all services (api or controllers), and even multi-purpose packages (util). These ways of organizing code are not putting Go package features to good

  • あなたのGoアプリ/ライブラリのパッケージ構成もっとシンプルでよくない? | フューチャー技術ブログ

    2023.10.5追記: Goチームからプロジェクトの目的に応じたディレクトリ構造についてのドキュメントが公式に公開されています。 https://go.dev/doc/modules/layout Goプロジェクトのフォルダ構成どうしよう、とググると見つかるStandard Go Project Layout。とはいえ、これはかなりコード量を増やしてしまう恐れがありますので、導入する場合のデメリットも考えておく方が良いです。 特に、プログラマーは、最初にみたプログラミング言語のフォルダ構成を親だと思う特性があり、Javaや.NETに影響されるとかなり細かくフォルダを切りたくなったり、package privateなど細かく可視性を制御しようとしたりして、なおかつ「privateのテストってどうすべきなんですか?」とか議論を始めたりもしますが、Go先生によればこれぐらいは1パッケージにフ

    あなたのGoアプリ/ライブラリのパッケージ構成もっとシンプルでよくない? | フューチャー技術ブログ