Go関連のことを調べてみた2020年03月28日

Go関連のことを調べてみた2020年03月28日

アプリケーション間でRequestIdを送りあってみる

# やりたいこと
サービスが複数またがってている場合、運用時にサービス間を跨いだログを見たくなる時があるので、その方法をかく。
順番は
1. Spring BootでRequestIdを生成して、ログファイルに出しておく
2. 他アプリケーション(今回はGin)に対して、リクエストを投げる
3. Gin側でRequestIdを受け取る

ソース
[Spring Boot](https://github.com/ririkku/spring-log-demo)
[Gin](https://github.com/ririkku/go-sandbox/tree/master/gin-nginx-sample)

# 環境
– Java
– Spring Boot
– Go
– Gin

# Spring Boot側にRequestIdの設定を入れる

## ログファイルにRequestIdが表示されるようにする

MDCを使用して、リクエスト毎にUUIDを生成して、ログに仕込めるようにしておく

“`SampleFilter.java
import org.slf4j.MDC;
impor

元記事を表示

Golangで、デザインパターン「Chain of Responsibility」を学ぶ

GoFのデザインパターンを学習する素材として、書籍「[増補改訂版Java言語で学ぶデザインパターン入門](https://www.hyuki.com/dp/)」が参考になるみたいですね。
取り上げられている実例は、JAVAベースのため、Pythonで同等のプラクティスに挑んだことがありました。
[Qiita記事: “Pythonで、デザインパターン「Chain of Responsibility」を学ぶ”](https://qiita.com/ttsubo/items/80fcaa529ce9f37e2543)

今回は、Pythonで実装した”Chain of Responsibility”のサンプルアプリをGolangで実装し直してみました。

# ■ Chain of Responsibility(チェーン オブ レスポンシビリティ・パターン)
「Chain of Responsibility」という英単語は、「責任の連鎖」を意味します。
このパターンは、ある要求の受取り対象となる複数のオブジェクトに鎖状の関係を構築し、要求を処理する事が可能なオブジェクトに渡るまで、順次、構築し

元記事を表示

Golangで、デザインパターン「Proxy」を学ぶ

GoFのデザインパターンを学習する素材として、書籍「[増補改訂版Java言語で学ぶデザインパターン入門](https://www.hyuki.com/dp/)」が参考になるみたいですね。
取り上げられている実例は、JAVAベースのため、Pythonで同等のプラクティスに挑んだことがありました。
[Qiita記事: “Pythonで、デザインパターン「Proxy」を学ぶ”](https://qiita.com/ttsubo/items/3933c059ab405d262514)

今回は、Pythonで実装した”Proxy”のサンプルアプリをGolangで実装し直してみました。

# ■ Proxy(プロキシ・パターン)
Proxyパターンは、プログラミングにおけるデザインパターンの一種。Proxy(プロキシ、代理人)とは、大まかに言えば、別の物のインタフェースとして機能するクラスである。その「別の物」とは何でもよく、ネットワーク接続だったり、メモリ上の大きなオブジェクトだったり、複製がコスト高あるいは不可能な何らかのリソースなどである。
Proxyパターンのよく知られている例として、参

元記事を表示

gormとgolang-mitateでオートマイグレーションをやってみた

# gormとgolang-mitateでオートマイグレーションをやってみた

goのマイグレーション探してたらgolang-migrateが良さそうだったので使ってみた

https://github.com/golang-migrate/migrate

今回やったのはgormを使った場合の実装
https://github.com/jinzhu/gorm

## パッケージ構成
“`
.
├── cmd
│   └── main.go
├── internal 
│   └── infrastructure
│      └── sql_handler.go
└── migrations
   ├── 20200319010701_create_table.down.sql
   └── 20200319010701_create_table.up.sql
“`

## マイグレーションファイル
“`20200319010701_create_table.up.sql
CREATE TABLE sample(
id VARCHAR(26) PRIMARY

元記事を表示

Golang 入門する

個人的なメモとして用いる。

## GOの特徴
– コンパイラ言語
– 静的型付け言語
– 文法がシンプル
– クロスコンパイルが可能
– 標準パッケージが豊富

## ソースコードの構成
“`main.go
// パッケージの定義
package main

// 標準パッケージや外部ライブラリのインポート
import “fmt”

// main関数の定義
func main {
fmt.Println(“Hello World”)
}
“`

## プログラムはどこから実行されるのか
– main関数
– mainパッケージに存在する
– ソースコードを追う時はここから
– プログラムのエントリポイントで、初期化後はここから実行される
– webサーバの場合は常に実行されているので代わりにhttpハンドラを読む

## Goプログラムの構成要素
– パッケージ
– 型
– 関数
– 変数
– 定数

## パッケージ
– 関数や定数・変数・型を意味のある単位でまとめたもの
– Goプログラムはパッケージの組み合わせでできあがる

元記事を表示

Gin+Realize+docker-compose+Nginxで環境を整えてみる

Gin + Nginxで仕事でも使えるかな、と思いつつ開発環境を作成する

ソースは[こちら](https://github.com/ririkku/go-sandbox/tree/master/gin-nginx-sample)

# 環境
Go 1.14
Gin 1.5.0
Docker 19.03.8
docker-compose 1.25.4

# やること
1. GinでREST APIを作成
1. realizeでホットリロードできるようする
1. docker-composeでNginxを立ててリバプロする

# GinでREST APIを作成
GETでリクエストがきたら、 `{“key”:”value”}`を返すだけのコードを作成

“`main.go
package main

import “github.com/gin-gonic/gin”

func main() {
router := gin.Default()

router.GET(“/api”, func(context *gin.Context) {
context.JSON(200, g

元記事を表示

Goの門をくぐってみる(GoとGinのQuickStart)

なんとなく触ってみたいなと前々から思ってたので、チャレンジ。普段はJavaを書いています。なので、型が欲しいという思いでGoに触れてみます。僕はGoについての知識0なので、どこまで簡単に作れるのかもみていきたいです。

いろんな規則や、わからないことがあれば、以下の2つのサイトを探りながら書いていきたいと思います。

– https://golang.org/doc/effective_go.html
– http://go.shibu.jp/effective_go.html

# 事前準備

## homebrew
[この](https://brew.sh/)サイトからinstallできます

## go
コマンド打つだけ、簡単

“`
brew install go
“`

versionは1.14

“`.sh
ri2kku~:$:
->> go version
go version go1.14 darwin/amd64
“`

# 何がともあれGoのQuickStart
Go公式のQuickStartを参考に世界に挨拶してみます
https://golang.or

元記事を表示

Golangで、デザインパターン「Flyweight」を学ぶ

GoFのデザインパターンを学習する素材として、書籍「[増補改訂版Java言語で学ぶデザインパターン入門](https://www.hyuki.com/dp/)」が参考になるみたいですね。
取り上げられている実例は、JAVAベースのため、Pythonで同等のプラクティスに挑んだことがありました。
[Qiita記事: “Pythonで、デザインパターン「Flyweight」を学ぶ”](https://qiita.com/ttsubo/items/2fecba5f66c7271128ab)

今回は、Pythonで実装した”Flyweight”のサンプルアプリをGolangで実装し直してみました。

# ■ Flyweight(フライウェイト・パターン)
Flyweightパターン(フライウェイト・パターン)とは、GoFによって定義されたデザインパターンの1つである。 等価なインスタンスを別々の箇所で使用する際に、一つのインスタンスを再利用することによってプログラムを省リソース化することを目的とする。

## UML class and sequence diagram
![W3sDesig

元記事を表示

Golangで、デザインパターン「Facade」を学ぶ

GoFのデザインパターンを学習する素材として、書籍「[増補改訂版Java言語で学ぶデザインパターン入門](https://www.hyuki.com/dp/)」が参考になるみたいですね。
取り上げられている実例は、JAVAベースのため、Pythonで同等のプラクティスに挑んだことがありました。
[Qiita記事: “Pythonで、デザインパターン「Facade」を学ぶ”](https://qiita.com/ttsubo/items/f0d0b63ef20aeca7f11a)

今回は、Pythonで実装した”Facade”のサンプルアプリをGolangで実装し直してみました。

# ■ Facade(ファサード・パターン)
Facadeパターンあるいは Façadeパターン(ファサード・パターン)とは、GoF(Gang of Four; 4人のギャングたち)によって定義された、コンピュータソフトウェアのデザインパターンの1つである。Facade(ファサード)とは「建物の正面」を意味する。異なるサブシステムを単純な操作だけを持ったFacadeクラスで結び、サブシステム間の独立性を高め

元記事を表示

Azure Functions で Go 言語を使おう(Go 1.14.2 待ち)

Azure Functions custom handler というものを使うと、Web API を作れる言語なら、なんでも Azure Functions の上で動かせるようになります!!まだプレビューですけど、楽しみな機能です!!

端的に言うと、Azure Functions がサポートしていない言語での開発や、Azure Functions がサポートしている言語でも特定の Web API を開発するフレームワークを使って開発するといったことが出来ます。サポートしていない言語での開発だと Go 言語で開発出来たり、後者の例だと Node.js で express を使って開発したり C# で ASP.NET Core を使って開発したりといったことが出来ます。

ドキュメント:[Azure Functions custom handlers (preview)](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-custom-handlers)

## 仕組み

`host.json` に裏で動く

元記事を表示

【Go】Lambda + RDS 接続にRDS Proxyを使ってみた

## はじめに
現在、API Gateway + Lambda + RDSを使ってWebアプリケーションを作っています!2019年末に行われたre:Invent 2019で発表された、[RDS Proxy](https://aws.amazon.com/jp/rds/proxy/)(現在はプレビュー版です。)を試してみたので備忘録です。

## RDS Proxyってなに?
簡単に言うと、データベースへのコネクションプールを確立、管理することで、アプリケーションからのデータベース接続数を少なく抑えることができるサービスです。

Lambda関数は、呼び出すごとに新しいコネクションを作成する必要があります。しかし、LambdaからRDSへの同時接続数には上限があり、これまではコネクション数が上限に達しないようにする必要がありました。これを解決してくれるのがこの**RDS Proxy**です。RDS Proxyを利用することで、既存のコネクションを再利用することができ、コネクション数を抑えることができます。

つまり、Lambda + RDSの構成が避けられていた原因の1つの同時接続数問題

元記事を表示

ゴリラ言語の読み方

先日、「ウ」と「ホ」と改行文字だけでプログラミングできる「ゴリラ言語」を作りました。

コード短いのでそのまま張っておきます。

“`

元記事を表示

API設計について調べたことのまとめ

API設計について、最近得た知見をまとめました。私がGoで開発しているのでGoベースの話になります。
間違いがあればコメントで教えていただければ幸いです。

# 参考資料
– GopherCon 2018 : [GopherCon 2018 – How Do You Structure Your Go Apps?](https://about.sourcegraph.com/go/gophercon-2018-how-do-you-structure-your-go-apps)
– デモのソースコード : [katzien/go-structure-examples](https://github.com/katzien/go-structure-examples/tree/master/flat)
– クリーンアーキテクチャのソースコード : [go-clean-arch](https://github.com/bxcodec/go-clean-arch)
– SlackのGophers, StudentGoなどの得た情報
– 株式会社オージス総研 クラウドインテグレーションサービス

元記事を表示

GoでEd25519+SHA256のアドレス導出してみる(Symbol,Catapult,RC5)

# はじめに

catapult-serverのv0.9.3.1から、公開鍵の導出方法が変わりました。

https://github.com/nemtech/catapult-server/releases/tag/v0.9.3.1

いままでは、Ed25519+Keccak256だったのが、標準のEd25519に変わりました。

ということで、GoのEd25519ライブラリが使えるんじゃないかと思うので、やってみたいと思います。

# 秘密鍵から公開鍵とアドレスを導出する

こちらのNIP10を参考にやっていきます。

https://github.com/nemtech/NIP/blob/eef91708a05fc6ce24a903d742ff46682008a8b7/NIPs/nip-0010.md

## 公開鍵

NIP10に例示してある秘密鍵と公開鍵は、

“`yaml
private: 575dbb3062267eff57c970a336ebbc8fbcfe12c5bd3ed7bc11eb0481d7704ced
public: 2e834140fd66cf87b

元記事を表示

Golangで、デザインパターン「Decorator」を学ぶ

GoFのデザインパターンを学習する素材として、書籍「[増補改訂版Java言語で学ぶデザインパターン入門](https://www.hyuki.com/dp/)」が参考になるみたいですね。
取り上げられている実例は、JAVAベースのため、Pythonで同等のプラクティスに挑んだことがありました。
[Qiita記事: “Pythonで、デザインパターン「Decorator」を学ぶ”](https://qiita.com/ttsubo/items/6f1569425644054dd079)

今回は、Pythonで実装した”Decorator”のサンプルアプリをGolangで実装し直してみました。

# ■ Decorator(デコレータ・パターン)
Decoratorパターン(デコレータ・パターン)とは、GoF(Gang of Four; 4人のギャングたち)によって定義されたデザインパターンの1つである。 このパターンは、既存のオブジェクトに新しい機能や振る舞いを動的に追加することを可能にする。

## UML class and sequence diagram
![W3sDesign

元記事を表示

Golangで、デザインパターン「Composite」を学ぶ

GoFのデザインパターンを学習する素材として、書籍「[増補改訂版Java言語で学ぶデザインパターン入門](https://www.hyuki.com/dp/)」が参考になるみたいですね。
取り上げられている実例は、JAVAベースのため、Pythonで同等のプラクティスに挑んだことがありました。
[Qiita記事: “Pythonで、デザインパターン「Composite」を学ぶ”](https://qiita.com/ttsubo/items/bbae96baa0dec7f4e7a5)

今回は、Pythonで実装した”Composite”のサンプルアプリをGolangで実装し直してみました。

# ■ Composite(コンポジット・パターン)
Compositeパターン(コンポジット・パターン)とは、GoF (Gang of Four; 4人のギャングたち) によって定義された デザインパターンの1つである。「構造に関するパターン」に属する。Compositeパターンを用いるとディレクトリとファイルなどのような、木構造を伴う再帰的なデータ構造を表すことができる。
Composite

元記事を表示

Goでのint型変数の絶対値出力

# はじめに
Go言語でPaizaを解いていた時に絶対値の出力で詰まったためメモ。
初学者のため誤り等ありましたらご指摘ください。
Goバージョン:1.13.8

# Goでの絶対値の出力方法
下記のように**int型**の変数aを**math.Abs**を使用し絶対値を出力しようとした場合、エラーとなった。

### エラーとなったコード
“`go
package main

import (
“fmt”
“math”
)

func main() {
var a int
a = -1
fmt.Println(math.Abs(a))
}
“`

“`
cannot use a (type int) as type float64 in argument to math.Abs
“`
どうやらmath.Absではfloat64の型しか許容していないよう。

### 正常に動作したコード
int型の変数aをfloat64型にキャスト変換した上でmath.Absにて絶対値を取得。その値を変数bに設定。
整数で出力するために変数bをint型に変換して出力。

“`go

元記事を表示

Golangで、デザインパターン「Bridge」を学ぶ

GoFのデザインパターンを学習する素材として、書籍「[増補改訂版Java言語で学ぶデザインパターン入門](https://www.hyuki.com/dp/)」が参考になるみたいですね。
取り上げられている実例は、JAVAベースのため、Pythonで同等のプラクティスに挑んだことがありました。
[Qiita記事: “Pythonで、デザインパターン「Bridge」を学ぶ”](https://qiita.com/ttsubo/items/690d6d75ed6f5ff4b958)

今回は、Pythonで実装した”Bridge”のサンプルアプリをGolangで実装し直してみました。

# ■ Bridge(ブリッジ・パターン)
Bridgeパターン(ブリッジ・パターン)とは、GoF(Gang of Four; 4人のギャングたち)によって定義されたデザインパターンの1つである。 「橋渡し」のクラスを用意することによって、クラスを複数の方向に拡張させることを目的とする。

## UML class and sequence diagram
![W3sDesign_Bridge_Design

元記事を表示

試して理解するDependency Injection in Go

## はじめに
Goでクリーンアーキテクチャやレイヤードアーキテクチャを実装しようとすると、`DI(Dependency Injection)`や`DIP(Dependency Inversion Principle)`などの概念が出てきて思うようにアーキテクチャに対する理解が進みませんでした。

また、GoでDIについて解説された記事は既にいくつかあるのですが、いまいち腑に落ちていなかったので自身の知識を整理するためにこの記事を書きました。

この記事ではシンプルな実装でDIに触れ、DIのメリットを体験できることを目的とします。

DIについてはこちらの記事にわかりやすくまとまっていますので、そもそもDIって何?という方はぜひ参考にしてみてください。
https://qiita.com/hshimo/items/1136087e1c6e5c5b0d9f

## DIのメリット
DIについて細かく説明するのはこの記事の本題ではないのですが、DIを導入するメリットについては軽く触れておきたいと思います。

DIのメリットは以下の2つです。
– オブジェクト間の結合度を下げる
– 依存関係

元記事を表示

structの処理を差し替えてテストする

現職に就いてからは初めての投稿。

転職に伴い以前は興味半分にしか触っていなかったGoについて本格的に開発で利用することになった。
言語の勉強も兼ねてツールを作って試行錯誤している中で最近やり方を調べながら進めたネタについてのメモで。

#### 免責

まだGoを手探りで勉強中で作法とかあまりわかっていないので、その中でこうやるとうまくいったよという一例として閲覧いただければと思います。
(いいやり方かどうかはわかりません、むしろお作法的に良い方法あればコメ投げてください)

## 経緯

ファイルの変更を検知してあれやこれややるツールを作っていて、ファイルイベントの検知に [fsnotify](https://github.com/fsnotify/fsnotify) を利用している。

“`go
import “github.com/fsnotify/fsnotify”

func someFunc() error {
var w, err = fsnotify.NewWatcher()
if err != nil {
return err
}
defer w.Cl

元記事を表示

OTHERカテゴリの最新記事