golang
OpenAPI何もわからんですが、 Go で OpenAPI 3.0 に対応したいと思ったのですが、swaggerはどうやら OpenAPI 2.0 とやららしいので、 oapi-codegen を利用してみました。 インストール goがインストールされれている環境で go install github.com/deepmap/oa…
この記事は Go Advent Calendar 2020 14日目 の記事です。 みなさん Go してますか? Spanner も触ってますか? 最近やっと部分的に本番環境で Spanner を利用し始めました。 Spanner のスキーマなどを git で管理しつつ、チーム内でレビューなどをしつつ運…
タイトルの通りで 60 分ほどで静的解析が理解できるコンテンツを見つけたので共有。 静的解析ってなんじゃ? ASTってなんじゃ? って状態から、「なんとなく静的解析やれそう」になれたのでぜひ試してみてほしい。 静的解析をはじめよう - Gopherをさがせ!
Go のテストに並列機能があるので、それで単純に速度アップができるのかという点と、 parallel オプションで並列数操作したらちゃんと反映されるよね。という点を確認した。 早速ソースコード slow_test.go func Test_slow1(t *testing.T) { time.Sleep(3 * …
自分個人の環境はいつも最新のGoを利用しているので特にgoenvなどのようなバージョンを切り替えるツールを使っていないのですが、Goのバージョンを切り替えて使いたい人もいるみたい。 体感的にgoenvを利用している人が多そうではありますが、Go標準に複数の…
いまさらながら、なるほどーと思ったのでメモ。 go1.13のerrorsのUnwrap関数が以下のように実装されている // Unwrap returns the result of calling the Unwrap method on err, if err's // type contains an Unwrap method returning error. // Otherwise,…
この記事は こちら をなぞってみた記事になります。 GraphQLをこれから始めたいという方におすすめ gqlgenを利用してGraphQLサーバを実装する方法です。 todoのリストを返却する 新しいtodoを作成する 完了したtodoをマークする ちなみにココからの手順はgo …
Goはテストの機能としてベンチマークを測定する機能が標準で提供されています。 ただ、そのままだとテストコードを実行できる環境でしか実行ができなかったりするため、 main関数から実行したい場合もあるかと思います。 今回はmainからベンチマークを実行で…
pprof とは Go言語のプロファイリングツール。 Web UIでフレームグラフや、関数の実行時間のグラフを見ることができる 通常のpprof利用方法 pprofの使い方として2つのパターンがあります。 runtime/pprof : ファイルにプロファイル情報を出力する net/http/…
Appengine/goが過渡期とでもいいましょうか、 日々変化も目まぐるしく、いろいろ気をつけるべき点もありそうなので雑にまとめました。 ご参考まで。(2019/09/10現在) GAE/go 1.9 は終わり 画像のとおりです。 警告: Go 1.9 ランタイム バージョンは非推奨…
goのベンチマーク周りのメモです 2つのベンチマークの比較 godoc.org pprof のツール github.com goのパフォーマンス周りの資料(observability) bit.ly GoのSSA最適化 qiita.com おまけ 厳密なgofmt github.com go!
appengine go1.11以降でgoでもプロファイラが使えるようなので初期設定だけやってみます。 内容的にはほぼ こちら の内容です。 Stackdriver Profiler は何ができるの? Goの場合には、CPU、ヒープ、競合、スレッドに関するプロファイリングが可能です。 そ…
Javaで育った私としては、前方一致/後方一致は StartsWith/EndWith というイメージが勝手にありますが、 goを書いているとたまにど忘れするので備忘録。 go での前方一致/後方一致 goでももちろん前方一致/後方一致のための関数は用意されています。 strings…
ちょっとした負荷試験をしたい場合に、abが入っていればいいのですが、そうも行かない場合も多いので、go製で簡単にインストールできる hey を試します。 負荷ツールのタイプは2種類ある HTTPの負荷ツールには2タイプあります。 レスポンスが返される限り全…
前回は モノレポ(mono repository)内でgoのmoduleを相対パスで利用する方法 という記事を書きましたが、今回はさらにモノレポで管理しているAppengineの複数のサービスをデプロイする方法になります。 なぜGAEのデプロイの記事が必要? 前回の記事を試した…
goの依存管理ツールはいろいろありますが、最新はGo Modules(mod)を利用することが多くなってきたと思います。 dep(vendor)を利用した依存解決の場合にはgopath配下にあればある程度柔軟に相対的に依存を解決できましたが、 modは普通に利用するとリポジトリ…
Appengine (GAE) はリクエストのイベントでインスタンスが起動されるので、通常のアプリケーションを実装した際に初回1回だけ実行する処理というのが普通に実装するとなかなか難しい。 特にDB(Datastore)アクセスなどが必要な場合にはrequestが無いとappen…
Motivation 基本的には自分はgolangでプログラムを書くことが多いので、go入れておきます。 goのバイナリのダウンロード ここ のページからアーキテクチャが ARM のものを選択しましょう。 ブラウザからリンクを右クリックしてURLをコピーします 一応ホーム…
タイトルのとおりなんですが、 goでsliceのディープコピーを作りたかったので。 やり方は以下。 orig := []string{"a", "b", "c", "d", "e", "f"} // 元sliceデータ fmt.Printf("%p, %v\n", orig, orig) // 0x10438150, [a b c d e f] copy := append([]stri…
Goのスライス同士を結合しようとした場合、 泥臭くループを回してappendをしようとしたあなた。ちょっと待って。✋ append のシグニチャをみてみる builtin.go を読んでみましょう func append(slice []Type, elems ...Type) []Type ほほう。 二つ目の引数は…
goでディレクトリを作成する場合、 os.Mkdir("./hello", os.ModePerm) のような感じで簡単にディレクトリを作れますが、 深い階層まで再帰的にディレクトリを作成したい場合には以下の方法を利用します。 再帰的にディレクトリを作成する os.Mkdir は単一の…
タイトルの通りですが、 goでconstで定義したstringの値をポインタとして渡したい箇所があり、 constで定義した値をそのまま渡そうと思ったら cannot take the address~~ みたいな形で怒られたのでメモ ざっくりとしたコード 具体的にはgoでS3のsdkを使って…
結論からいうと yes. です。 io.goのファイル内の実装で func Copy(dst Writer, src Reader) (written int64, err error) { return copyBuffer(dst, src, nil) } func CopyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error) { if buf …
GCPUGのSlack で知ったネタの備忘録 本番環境のDatastoreのデータは appcfg.py を利用して取得することができる。 参考記事 : GAE/Goで本番のDatastoreをローカル環境に持ってくる 2016 - Qiita おまけ make でこんな感じに実行してもいいみたい replilocal:…
goでio.Readerからbyteのスライスやstringに変換する書き方をたまに忘れてしまうのでメモ。 コード // io.Readerをbyteのスライスに変換 func StreamToByte(stream io.Reader) []byte { buf := new(bytes.Buffer) buf.ReadFrom(stream) return buf.Bytes() }…
golangでbyteをstringに変換する処理はたびたび発生するのですが、 手抜きで fmt.Sprintf("%s", byte) などとやっちゃうこともあるのでそれぞれの書き方でどれが速いのか確認してみた。 1) Sprintfを使うパターン fmt.Sprintf("%s", data) 2) string() を使…
そろそろ新しいgoが入るかなと思い、 brew update;brew upgrade コマンドを実行したところ、go1.9がインストールされたので、既存のプロジェクトのテストを試しに実行してみたところ以下のようなエラーが発生した。 flag provided but not defined: -goversi…
direnv使い始めようとしてましたが、言語に最適な環境をセットアップする機能なんてあったんですね。 layout program_name :その言語用の開発環境をセットアップ Go言語であれば layout go のように.envrcに書けば良いわけですね。ふむふむ。
Go言語のソースコードを読んでいた時に関数の定義がわかりづらいのがあった。 どうやら構造体にメソッドを実装することが出来るっぽい。 func (レシーバ名 レシーバの型) 関数名(引数) (戻り値) 定義はこんな感じ。 // 構造体宣言 type User struct { name s…
題名の通り、Go言語のswitch文は暗黙でcaseの最後にbreakが入ります。 なので i := 1 switch i { case 1: fmt.Println("1") case 2: fmt.Println("2") default: fmt.Println("other") } と書くとcase 1にマッチし、case 2には入りません。 fallthrough 逆にc…