技術メモ

技術メモ

ラフなメモ

Go

go-cmpを使う理由とTipsの紹介

はじめに これは Go 4 Advent Calendar 2020 8日目の記事です。 Goのテストにおいて、構造体を含めて型の値を比較したいという場合は往々にしてあります。ロジックの結果はなんらかの値として作用することが多いですから、型の値を比較したい、というのは自…

条件付きのロジックをTempleteMethodパターンで置換する

Go

コードが複雑になる要因の一つとしてif文やswitch文による条件付きロジックがあります。以下のような給与を計算する実装例を考えてみます。(employeeType が文字列、という話はおいておきます) switch 文があると呼び出し側の実装が複雑になります。switch …

条件付きのロジックをStrategyパターンで置換する

Go

コードが複雑になる要因の一つとしてif文やswitch文による条件付きロジックがあります。以下のような給与を計算する実装例を考えてみます。(employeeType が文字列、という話はおいておきます) switch 文があると呼び出し側の実装が複雑になります。switch …

IDのモックを作る

IDを生成する必要があるときにUUIDやxidを用いることがあります。テストの結果にIDが含まれてしまう場合にIDの生成をモックする方法を紹介します。本記事では rs/xid を用いてIDを生成することにします。ポイントは関数型の変数にすることです。もちろんイン…

Goで構造体をDeepCopyする

Go

はじめに Goで構造体のDeepCopyする方法の紹介です。Goのsliceやmapは値への参照を保持しているため、単純に値をコピーするだけではDeepCopyできないことはよく知られています。以下は間違った実装例です。 package main import "fmt" func main() { s := []…

DynamoDB LocalとGoを用いた実装と、CircleCIでのCIの設定方法

本記事ではDynanmoDB Localを用いてローカルでのGoを用いた開発をする方法と、CircleCIを用いてCIを実施する方法を示します。 DynamoDB Localのセットアップ まずDynamoDBにはDynamoDB Localと言われるエミュレーターがあるので、ローカルでの開発はDynamoDB…

GoでHTTPサーバのログを出力する方法

Go で HTTP サーバを構築したときにログを取得する方法を考えてみます。 ログに出力したい情報 HTTP ステータスコード レスポンスボディ HTTP ステータスコードを取得する方法は、以下の記事が詳しいです。本記事では http.ResponseWriter を用いてレスポン…

Goで静的単一代入(SSA)形式に入門する

静的単一代入(SSA)形式 SSA形式とは、変数の定義がプログラムの字面上で唯一になるようにしたプログラムの表現形式である。静的とは、プログラムの字面上で、という意味である。変数の定義が唯一になるように変数の名前替えを行うが、これは普通変数の添字を…

Go製のマルチプラットフォームなクリップボードライブラリを作った

Go

はじめに Go でマルチプラットフォームで動く CLI を作っていて、その過程でクリップボードにコピーしたり、ペーストできるようなライブラリがほしくなった。 マルチプラットフォームで動く Go のクリップボードライブラリを探してみると、ほとんど出てこな…

orelangをGoで実装した

Go

以下の記事を読んで私も orelang を実装してみました。実装は記事に沿った形にしています。 qiita.com https://github.com/d-tsuji/orelang 字句解析を JSON パーサにおまかせしているので、やっていることはパースした JSON に含まれる文字を見て順番に評価…

Goで再帰的にディレクトリのファイルを取得する方法

Go

はじめに ディレクトリにあるファイルの一覧を取得したい機会があると思います。シェルの find みたいな動作を Go で実現する方法の一つとして ioutil.ReadDir を用いて深さ優先探索をする方法があります。その他には filepath.Walk を用いる方法が考えられ…

Qiisync開発雑記

Go

はじめに Qiita の記事を CLI で投稿したり、更新することができるクライアントツールを作りました。 https://github.com/d-tsuji/qiisync 機能的な紹介は README が詳しいので、このブログでは開発に関する雑記を記したいと思います。 CLIの設計 フォルダ構…

APIサーバのおけるGoのエラーハンドリングについて考えてみる

Go

Go のエラーハンドリングについて考えてみます。ここではライブラリの中で扱うようなエラーハンドリングではなく、Web アプリケーション、とりわけ API サーバとして振る舞うようなアプリケーションでのエラーハンドリングについて考えます。前提として Erro…

パフォーマンス向上のためのsql.DBの設定

こちらは Configuring sql.DB for Better Performance の日本語訳です。 パフォーマンス向上のためのsql.DBの設定 Go の sql.DB 型や SQL データベースのクエリやステートメントを実行するための使い方を説明した良いチュートリアルがたくさんあります。しか…

Goにおけるフラットアプリケーション構造

こちらは Flat Application Structure in Go の日本語訳です。 Flat Application Structure in Go コードをパッケージに分割する方法を見つけ出すのに時間を費やすよりも、フラットな構造を持つアプリケーションでは、すべての .go ファイルを単一のパッケー…

HTTP Middleware の作り方と使い方

こちらは Making and Using HTTP Middleware の日本語訳です。 HTTP Middleware の作り方と使い方 ウェブアプリケーションを構築しているときに、多くの(あるいはすべての)HTTPリクエストに対して実行したい共通機能があるかもしれません。すべてのリクエス…

GoのHTTPサーバーの実装

はじめに Goは標準パッケージとしてHTTPサーバが組み込まれており、net/http パッケージを用いると簡単にHTTPサーバを動かすことができます。今回は net/http パッケージの一部(HTTPサーバの内容)の実装を読むことで、HTTPサーバが動く裏側を見てみたいと思…

GoのHTTPクライアントの実装

GoのおけるHTTPクライアントの実装をまとめていきます。 How to issue HTTP request 1. http.Get を用いる 2. http.Client を用いる 2-1. client.Get を用いる 2-2. http.NewRequest を用いる 2-3. http.Transport を用いる Implementation type Client 1-1.…

ワークフローエンジンをGoで実装した

ワークフローエンジンとは? 定期的なタスクの実行し、結果を管理 タスク間の依存関係を定義して、適切な順序関係に制御してタスクを実行 タスクの実行状況/結果を管理 するソフトウェアのことです。例えば、日々の業務で発生する大量のデータを収集し、加工…

GoでMQTTのpub/subを試す

MQTT Broker MQTT Brokerはmosquitoを使うことにする。Dockerで立ち上げる。 > docker run -it -p 1883:1883 -p 9001:9001 eclipse-mosquitto 1577610628: mosquitto version 1.6.8 starting 1577610628: Config loaded from /mosquitto/config/mosquitto.co…

GoでポインタのString()をしたときの興味深い結果

Go

はじめに 標準出力する際に fmt.Print を用いることがあると思います。ポインタを fmt.Println に渡すと興味深い結果が表示されることがあります。その例を紹介します。 まずは以下の実装例を見てください。単に fmt.Println で time.Now() の変数とそのポイ…

Goのエラーの生成方法

Go でエラーを生成するときにどのように生成するのがいいのか、少し考えました。 私はエラーを扱うときはたいてい pkg/errors を使うようにしています。エラーをスタックできるのが便利ですよね。 エラーの起点になるときには fmt.Errorf() や errors.New() …

「Go言語でつくるインタプリタ」を読んだ

「Go言語でつくるインタプリタ」を読んだ感想を連ねます。 Go言語でつくるインタプリタ作者: Thorsten Ball,設樂洋爾出版社/メーカー: オライリージャパン発売日: 2018/06/16メディア: 単行本(ソフトカバー)この商品を含むブログを見る インタプリタをつく…

インターフェース値のnilを扱うということ

インターフェース型 Golangのインターフェース型は、具象型がインターフェースのインスタンスとして見なされるために必要なメソッドの集まりを定義します。例えば標準パッケージのioに含まれる以下のReaderやWriterはインターフェース型です。 package io ty…

gonum/plotを用いたSVGファイルの生成

plotするデータのサンプルは Example plots を用いることにします。 package main import ( "bytes" "io/ioutil" "math" "math/rand" "gonum.org/v1/plot/vg/draw" "gonum.org/v1/plot/vg/vgsvg" "gonum.org/v1/plot/vg" "gonum.org/v1/plot" "gonum.org/v1/…

GolangでWebSocketを使ったHTTPサーバを実装する

はじめに GolangでWebSocketを使ったHTTPサーバを構築します。 WebSocketの仕様は RFC6455 で定められています。Webアプリケーションにおいて、双方向通信を実現するための技術規格です。Ajaxではブラウザからサーバにデータの送信要求を出す手段でした。Web…

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.Prin…

GolangのContext

背景など https://blog.golang.org/context Goを使ったサーバでは、それぞれのリクエストはgoroutineを用いて扱われる。リクエストハンドラーは別のバックエンドのデータベースやRPCサーバにアクセスするために別のgoroutineを生成して処理する。これらのgor…

Go言語による並行処理の点検読書

Go言語による並行処理作者: Katherine Cox-Buday,山口能迪出版社/メーカー: オライリージャパン発売日: 2018/10/26メディア: 単行本(ソフトカバー)この商品を含むブログを見る 全体として何に関する本か、何がどのように詳しく述べられているか Goでの並行…

Go言語に入門

Sphinxの勉強も含めて、Go言語に入門した時にまとめた内容を以下にまとめておきました。 d-tsuji.github.io