emahiro/b.log

Drastically Repeat Yourself !!!!

go

Go に Contribute する

go

Overview 準備 CLA の同意とアカウント作成 レビューツールを入れる 早速コミットしてみる まとめ 余談 VSCode で Go の最新版を開発する (Go1.18 の場合) VSCode のセットアップ方法 Overview これは 2021年Goアドベントカレンダー 7日目の記事です。 つい…

メソッドを持つ参照型をフィールドに持つ Struct の初期化後のアクセスについて

go

Overview Sample まとめ Overview メソッドを持つ参照型をフィールドを持つカスタム struct を初期化したときの参照型が持つ(見かけ上ネストしてる)メソッドにアクセスした時の振る舞いがたまたま職場の雑談で上がり、挙動について調べてみたのその備忘録…

go-cmp の cmp.Option と可変長引数 `...` について少し調べた話

Overview go-cmp の cmp.Option How to use cmp.Option cmp.Options の中に option で指定したい設定を入れる cmp.Option 単体を指定する slice にして指定する Go の可変長引数の指定方法について cmp.Options をそのまま Diff に指定できるわけ まとめ Ove…

Cookie に格納された情報を使っている Handler のテストを実装する

go

Overview 前提: そもそも Go で Cookie を操作するには? Cookie を使った認証機構がある Handler のテスト サンプル SecureCookie を使って Cookie で Session を扱う ちょっとだけリファクタリングする まとめ Memo http: Request.RequestURI can't be set…

Go で作る自作 Linter 開発入門

go

Overview 準備 自作 Linter を作る手順 GoAst Viewer で Ast の構造を視覚的に確認する 追記 x/tools/cmd/gotype singlechecker を使って検出する nodeFilter で階層を指定する Tips SuggestedFixes がめちゃくちゃ便利なので絶対に使う 使い方 ハマったとこ…

Go の string についてなんとなく調べた

go

Overview ちょっと興味があって Go の string の実装周りについてふらっと調べたので備忘録。 そのほかにも何かわかれば追記するかも。 Memo string 本体について string is the set of all strings of 8-bit bytes, conventionally but not necessarily rep…

fmt.Fprintf で ``(バッククオート)で囲った文字列をformatしたときにハマった話

go

Overview タイトルの通りです。 Go で文字列の中に改行コードが含まれていた場合 "" なら \\n のようにバックスラッシュを使ってエスケープしますが、そもそもの改行コードを含む文字列をバッククオートで出力した場合、自動で改行コードがエスケープされる…

byte 文字列を Int に変換する

go

Overview ちょっと凝ったユースケースですが、byte 文字列を Int に変換したいユースケースがあったときに使えるテクニックについてまとめます。 以下のようなユースケースを考えます。 func main() { b := []byte("123456") for idx := range b { fmt.Print…

Go でテキストを1行ずつ読み込む

go

Overview Go でテキストファイルを1行ずつ読み込んでいく方法を忘れてたので思い出しついでに備忘録です。 bufio を使う bufio を忘れてました。 こんな感じで処理できます。 package main import ( "bufio" "bytes" "fmt" ) // text ファイルに書かれてる内…

Loop 内の値渡しと参照渡しで久しぶりにハマった話

go

Overview 何が起きたか? 原因: 実態のコピーを上書きしていたので大元の slice の struct の値が書き変わらなかった まとめ 追記 20210531 Overview Go の loop 処理の中で Slice の中の全値を書き換えたいと言う処理、において参照渡しと値渡しを取り違え…

chi で独自の middleware 使う

go

Overview chi で独自 middleware を使う上で使い方を忘れていたのでその備忘録。 備忘録 router.Use(func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // middleware でやりたい処理 next.S…

AWS Go SDK V2 を使ってみる

Overview AWS SDK for Go V2 について AWS の設定をロードする 独自で環境変数を持ってる場合 DynamoDB を使う DynamoDB クライアントを Load する リソースを更新する expression はまだ feature だった 余談: 毎回めんどいなーところと思うところ Transact…

strings.Split は分割できない時でも長さ1の slice を返す。

go

https://play.golang.org/p/ss6gWvidE2u でなんで長さ 1 の slice が返ってくるんだろーって悩んでたのですが、、、 // Split slices s into all substrings separated by sep and returns a slice of // the substrings between those separators. // // If…

参照型変換メソッドを func で表現する

go

Overview タイトルの通りなんですが、Go の struct をするときにその struct のあるフィールドを参照型にすることがあると思います。 この参照型のフィールドに値を代入するために、プリミティブな型を参照型に変換するだけの関数を作成することがあるかと思…

同一文字列を繰り返す strings.Repeat

go

Overview テストケースで使えそうな strings の機能を教えてもらったので書いておきます。 テストケース書くときに使えることを教えてもらったhttps://t.co/tvtsGQjufL— ema (@ema_hiro) 2021年1月19日 Strings.Repeat https://golang.org/pkg/strings/#Repe…

Go で文字数をカウントする

go

Overview Go 言語で文字数をカウントする方法について記載します。 そもそも文字数を数えるとは? LINE Engineering のこのブログが詳しくてわかりやすいです。 engineering.linecorp.com ある文字列の文字数を計算するときに、コンピューター上で「何文字」…

Go で unused なコードを検出する

go

Overview staticcheck を使って unused なコードを一括で検査します。 Install $ go get honnef.co/go/tools/cmd/staticcheck ref: https://staticcheck.io/docs 検出する U1000 がどこからも参照されていないコードの警告コードになるので、検査結果を grep…

AWS Lambda 向けに trace 付き Logger を作った

Overview 業務で AWS Lambda を使用してとある実装をしたのでその紹介です。 久しぶりに業務でOSS作りました。https://t.co/5fNBhiRsle— ema (@ema_hiro) 2020年11月19日 github.com なぜ作ったのか? Lambda 上でログを吐くとデフォルトで Cloud Watch Logs…

プライベートリポジトリを go get する

Overview go get でプライベートリポジトリを fetch するのに、コケてその調査で時間を溶かすことが何度か重なったので対応方法について記載します。 またプライベートリポジトリに依存してるプロジェクトで Github Actions を回すときもプライベートリポジ…

指定したディレクトリを goimports の対象から外す

go

import 順を自動で sort するときに、goimports の対象から外したいディレクトリがあるときに $GOPATH/src/.goimportsignore を設定するといいらしいけど、リポジトリごとのディレクトリ分けに依存したり、個人の開発環境に依存するかなーと思ったで、なんと…

MySQL Driver で time.Time 型をパースする

go

以下のような Struct を考える。 type User struct { ID int64 Name String CreatedAt time.Time UpdatedAt time.Time } time.Time の時刻型をもつフィールドがある時、MySQL の時刻型のカラムをそのまま Scan しようとすると以下のエラーが出る。 sql: Scan…

久しぶりに sqlx を使ったら色々忘れてた

Overview すごい久しぶりに sqlx を使ったら色々忘れてたので備忘録です。 github.com driver は blank import しておかないといけない driver の種類は下記を参照 https://github.com/golang/go/wiki/SQLDrivers 例えば MySQL を Driver として選択したい場…

Go1.14 をサポートしました

go

Go の Release Policy に合わせて、以下のリポジトリを Go.1.14対応しました。 合わせて Go1.12 のサポートを切りました。 Each major Go release is supported until there are two newer major releases. ref: Release History - The Go Programming Langu…

Go をバージョンごとにコマンドとして入れる

go

こういうことができる。便利。 $ go get golang.org/dl/go1.X.X $ go1.X.X download $ go1.X.X version go version go1.X.X linux/amd64 公式のインストールページにも記載してある。 https://golang.org/doc/install#extra_versions

僕の考える net/http の定数の使いどころ

go

Overview Go の net/httpパッケージ には HTTP に関連する定数が予め定義されており、HTTP クライアントを実装するときなどに自前で定義したり、GET や 200 といった定数を実装しなくてもいいように、標準の net/http がデザインされています。 こういう実装…

関数を引数に指定して CallBack のように振る舞わせる

go

Overview 関数を引数に指定してすることで、呼び出し先の関数内にて、特定の条件で指定した関数を実行する (Callback のように振る舞わせる) 実装方法をやってみたのでその記録を記載する。 Log github.com Usecase R/W の競合を発生させないために sync.Mut…

ログを出力する車輪の再発明をしてみた

go

Go の 標準の log パッケージ の実装をベースに自前で管理のログ出力部分を実装してみました。 やったこと Go の標準の log パッケージをベースにして自前でログを実装する機会があったので、そもそも log パッケージ内の実装を読んで見ようと思ったのがきっ…

Go で n 番目の要素を削除する

go

大した話じゃないんですけど、忘れてたので備忘録です。 strs := []string{"a", "b", "c", "d", "e"} // "c" を削除する。 idx := 2 strs = append(strs[:idx], strs[idx+1:]...) fmt.Println(strs) ref: https://play.golang.org/p/3QP4OXw2X0u

Go の httptest で立てたサーバーにアクセスする

go

テストなどで実際にサーバーを立てずに、HTTP のリクエストをシミュレートしたいときに httptest を使いますが、この httptest で立てたダミーサーバーそのものアクセスする方法はないかを調べてみました。 Motivation あるテストをメンテしていた時に httpt…

Go で意図的に競合状態を発生させる

go

Summary Go では concrrent map writes のような競合状態の可能性がある実装があるときに排他ロックをかける。 競合状態を回避するためのサンプルとしてロックをかける実装はたくさんインターネット上に情報が出てくるが、そもそも意図的に競合状態を作り出…