Works by

Ren's blog

@rennnosuke_rk 技術ブログです

Golang

【Golang】io.Pipeのr/wブロック

io.Pipe io パッケージの関数 io.Pipe() は io.Writer を実装した PipeReader 、 io.Reader を実装した PipeWriter ポインタを返します。 PipeWriter.Write() で書き込みを行うと、その内容を PipeReader.Read() で読みこむことができます。 pr, pw := io.Pi…

【Golang】Unicode上複数コードからなる文字をruneで扱う場合の挙動

検証環境 Mac OS Catalina 10.15.6 Go1.15.6 tl;dr Unicode上でn個のコードからなる1文字を []rune に変換すると、[]rune スライス長は n になります。 前置き Goにおける文字列型 string の値は、 []byte スライスの値としても扱うことができます。 例えば…

【Golang】Goで形態素解析する - mecab-golang

MeCab とは MeCab: Yet Another Part-of-Speech and Morphological Analyzer 自然言語処理界隈では ChaSen と並び有名な形態素解析エンジン。 形態素解析とは、テキストデータを文法や単語の品詞情報(辞書)を元に言語の最小単位(形態素)へと分割し、各形…

【Golang】Golang:logパッケージを読む

log パッケージを読みました。 src/log/log.go - The Go Programming Language log Go の log はロギング処理に使用するパッケージ。 log パッケージはテストコードを除けば log.go のみで構成されており、log.go も 400 数行からなるシンプルな構成となって…

【Golang】GoのSQL driver mock `go-sqlmock` を試す

go-sqlmock とは go-sqlmock は Go の database/sql/driver の実装で、DB ドライバの振る舞いをモック化できるライブラリ。 go-sqlmock を使用することで、DB ドライバを必要するロジックと、実際の DB ドライバ以降の処理を分離してテストできる。 go-sqlmo…

【Golang】GoでTCPソケット通信を実装する

ソケット通信 ソケット(BSD)- Wikipedia ソケット通信とは、プログラムから見たときのネットワーク通信を抽象化する概念をさす。通信の終端をソケットと呼ばれるオブジェクトとみなし、ソケットに対して何かしらの入力を行うと、もう一方のソケットから出…

【Golang】net/httpのPath Parameterパース

net/http の handleFunc() handle() に登録できるパスは Path Parameter を認識しない。例えば、他の Web フレームワークのように、下記 /products/:id エンドポイント中の :id を変数として取得することができない。 // :idを変数としてパースできない http…

【Golang】Golangの並列実行時の競合状態検出

-race オプション Go バイナリ実行時、 -race オプションを指定することで競合状態のテストを実施することができる。具体的には go -race run go -race build のようにコード実行時、バイナリビルド時に指定できる。 ただし実行可能な環境は linux/amd64、fr…

【Golang】Golang : `runtime` パッケージを使用したモニタリング

Golang のメモリ使用量やゴルーチン数など、実行時ランタイムに関係するステータスを観測するには、 runtime パッケージを使用する。 Memory var m runtime.MemStats runtime.ReadMemStats(&m) // ヒープ上に割り当てられたオブジェクト累積メモリ量 fmt.Pri…

【Golang】Golang の map の非スレッドセーフ性と排他制御

Golang の map はスレッドセーフでない Golang の map はスレッドセーフ、もといゴルーチンセーフではない。そのため、複数のゴルーチンからの同時アクセスによって整合性が保たれない状態になることがある。 例えば、以下のように map に対して複数のゴルー…

【Golang】goimportsでプロジェクト配下のimport文すべてをパッケージ種類別に整形する

TL;DR 下記コマンドで、カレントディレクトリ配下のすべての .go ファイルの import 文を整形してくれる。 $ find . -print | grep --regex '.*\.go' | xargs goimports -w -local "github.com/your/package" goimports の -w オプションでファイルを直接書…

【Golang】Context

Golang における Context とは 大事なことは全部 Document に書いてある。おしまい。 context - The Go Programming Language ・・・と言ってしまうと元も子もないので、自分なりに整理してみる。 Go の Context を要約すると、 Web アプリケーションで横断…

【Golang】APIMATIC で Postman Collection を OpenAPI Specification に変換する

PostmanはOpenAPIと互換性があり、OpenAPI Specification(以下OAS)に沿って書かれたAPIドキュメントはPostmanへimportできる。一方で、PostmanからOpenAPIへのexportはサポートされていない。これはPostmanへのFeature requestとしても挙がっており、そこそ…

【Golang】Go のSSA表現形式のダンプとその解析

SSA 形式とは 静的単一代入(static simple-assignment)形式と呼ばれ、コンパイラによって生成される中間表現のこと。 SSA は、各変数への代入が一度のみ行われる式によって構成される。 例えば、以下のような式を含むコードを見ると、一行目のコードが不要で…

【Golang】Go 1.14 の重複するメソッドを持つインターフェース埋め込みの許可

proposal/6977-overlapping-interfaces.md at master · golang/proposal Go 1.14 より、重複するメソッドを持ったインタフェースの複数埋め込みが可能になった。 インタフェースの埋め込みは、あるインタフェース A を別のインタフェース B 内で宣言すること…

【Golang】Go ModulesのGo依存パッケージ管理

Go 1.11 から導入された Go Modules Go 1.11 より、Go 依存パッケージの解決のための Go Modules の概念が導入された。簡単に言うと、Go 公式でサポートされた npm のようなパッケージバージョン管理ツール。 Go プロジェクト配下に見受けられる go.mod go.s…

【Golang】Go 1.13 モジュールミラーリングサーバーとチェックサム DB

Go 1.13 より、Go モジュール関連のサポートが強化された。主な機能は以下の2つ。 パッケージをより高速にインストール可能なミラーリングサーバの設定 モジュールの信頼性を向上するチェックサム機構 依存モジュールのミラーリング Go 1.13 では、モジュー…

【Golang】Go1.13 errors ライブラリによるerror値の取り扱い

error のラッピング Go 1.13 より、 fmt.Errorf が error インタフェースを実装する値のラッピングをサポートした。この機能により、ある error 値を別の error に内包する事ができる。 func UpdateHoge(hoge: Hoge) error { err := app.UpdateHoge(hoge) if…

【Golang】 関数引数 - 値渡しとポインタ渡しの指針

Golangでの値渡しとポインタ渡しの指針 Golang にはポインタの概念がある。なので、C/C++同様に関数引数型を値型・ポインタ型の2つが指定できる。 func print(s string) { fmt.Println(s) } func printPtr(s *string) { fmt.Println(*s) } 値型で引数を渡し…

【Golang】エスケープ処理とその解析

Golang の memory allocation Golang は C/C++などと異なり、いい感じに変数のメモリ領域を割り当ててくれる。例えば、以下のようなコードでも Golang は動作する。 type Hoge struct {} func NewHoge() *Hoge { h := Hoge{} return &h } NewHoge() 内で生成…

【Golang】Goで画像処理: 画素勾配によるエッジ検出

画素勾配でエッジ検出 画像上に現れる物体の境界(エッジ)を検出する方法に、隣接する画素間の輝度の変化量を利用する方法があります。 この輝度の変化量が大きい部分をエッジとみなし、画像の分類や画像マッチングなどに使用できる特徴量として扱うことが…

【Golang】Goで画像拡張子を変換する

goで画像処理を行う場合、image パッケージを使用することができます。 image/jpeg image/png パッケージの Encode 関数で拡張子を変換します。 package main import( "os" "fmt" "bufio" "image" _ "image/jpeg" "image/png" ) func main() { // 入力画像パ…