地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

Go

【Go】ベンチマーク ツールのtips

Go

golang.org -benchmem メモリ関連の情報を出力。 -benchtime t 計測に使う時間をtで指定する。defaultは1s -cpuprofile=*.prof 詳細なCPUプロファイルが取れる go tool pprofで内容を見る -count テストする回数を指定 -cpu 実行するcpu数 -memprofile=*.pro…

【Go】ビルド時に情報を埋め込む

Go

goでビルド時に動的に値を入れてバイナリを生成するやり方です。ビルドの引数に -ldflags "-X main.version=バージョン" をつけることで実現できます。 package main var version string func main() { println("version: " + version) } makeでビルド時に動…

【Go】workerプールのテンプレを書く

Go

大容量ファイルのダウンロードだったりnasへの大量並列アクセスだったりをgoroutineで書くなら使えそうなワーカープール。サンプルはstring と worker id を受け取って、文字列のハッシュを計算というCPUリソースを食うやつだが色々と応用できるはず。 書い…

【Go】ネストされた構造体の値を書き変える

Go

stackoverflow.com ここの内容は大体上で言ってることとなってます。 type P1 struct { list *[]P2 } type P2 struct { node int } P1がP2のスライスへのポインタを持っている場合にP1のレシーバでP2が持つ値を書き換える方法。割とハマったのでメモ。 packa…

【Go】GolangCI-LintをGHAに組み込む

Go

GolangCI-Lintとは GolangCI-Lint とは、 Golang の Linter を一元管理するためのツールです。Goはliter一つとってもたくさんあってそれを組み合わせることでCIの信頼度を上げるという珍しい形を推奨しています。そのためこのような一元管理ツールが便利にな…

【Go】Go言語のcontextの理解メモ

Go

contextの主な用途は2つ Goroutineの適切なキャンセル リクエスト情報の伝搬 1つめはコンテキスト使わなくても実装可能だが2つめがちょっと難しい。そもそもコンテキスト型とは以下のように定義されている。 type Context interface { // Deadlineが設定され…

【Go】for selectパターンメモ

Go

チャネルからの受信を待つパターンでの実装。書き込めるチャネルをselectして実行みたいなのも可能。 package main import ( "fmt" "strconv" "time" ) type Result struct { Error error Response int } func doSomething(done <-chan interface{}, printSt…

【Go】fsnotifyを使ってみる

Go

github.com fsnotifyを使って特定ディレクトリ配下のファイルを監視して起きたイベントをコンソールに出力するCLIツールを作ってみた。 仕組みとしては linuxjm.osdn.jp アプリケーションで inotify ファイルディスクリプターを read(2) してそのイベントをO…

【Go】文字列操作Tips

Go

文字列の結合 s := "ABCDEFG" s = s + "hijklmn" fmt.Println(s) // -> "ABCDEFhijklmn" 文字列の 大文字、小文字変換 s = "ABCDEFGhijklmn" fmt.Println(strings.ToUpper(s)) // -> "ABCDEFHIJKLMN" fmt.Println(strings.ToLower(s)) // -> "abcdefhijklmn"…

【Go】Golangで型情報を調べる

Go

Golangで型情報を調べる package main import ( "fmt" "reflect" ) func main() { fmt.Println(reflect.TypeOf(1)) // int fmt.Println(reflect.TypeOf("")) // string fmt.Println(reflect.TypeOf([]string{})) // []string fmt.Println(reflect.TypeOf(tru…

【Go】defer

Go

Goには、deferステートメントというものがあり、deferへ渡した関数実行を、その呼び出し元の関数の終了時(return)まで遅延させることができます。 package main import "fmt" func main() { // main関数の最後に実行される defer fmt.Println("world.") fmt.…

【Go】GitHubActions GoのCIテンプレート

build -> test -> lintをするためのgo用のテンプレートyaml lintは以下を使ってます。 github.com jobs: setup: runs-on: ubuntu-latest steps: - name: set up uses: actions/setup-go@v2 with: go-version: ^1.13 id: go - name: check out uses: actions/…

【Go】SIGPIPEを無視する

Go

package main import ( "fmt" "os" "os/signal" "syscall" ) func main() { signal.Ignore(syscall.SIGPIPE) for { _, err := fmt.Println("Wow!") if err != nil { if e, ok := err.(*os.PathError); ok && e.Err == syscall.EPIPE { break } else { panic(…

カテゴリ用記事

カテゴリ用