- 0.1. イベントソーシングを知ろう ~ステートソーシングとの比較とGoでの簡単な実装例つき~
- 0.2. 【Go】Go1.22で試験導入されたrangefuncを理解したい!
- 0.3. Goでwebsocketを作ってみた
- 0.4. インストールしたけどパスが通っていなかった
- 0.5. Dockerで簡単なAPIサーバ(Go)を立てる
- 0.6. Go&echoで簡単にAPI作成
- 0.7. Go(guregu)+lambda+dynamoDBでデータのやりとりをしよう
- 0.8. Echo(Go)を使用してアプリを作成してみた【簡単なタスクのCRUD操作とJWPの認証機能】
- 0.9. ゴルーチン(goroutine)について_1
- 0.10. Go言語で簡単に請求書を生成:Invoice Generatorリポジトリの紹介
- 0.11. AWS SDKのモック実装例
- 0.12. クリーンアーキテクチャに入門してみた
- 0.13. github.com/kubernetes/client-go informers 和訳
- 0.14. Goのdefer実行タイミング
- 0.15. GoのLambdaをGithub Actions + Terraformでデプロイする
- 0.16. OpenAPIのyamlファイルとoapi-codegenでGoの自動生成をやってみた
- 0.17. Golang 並行処理(goroutine)を覚えよう!
- 1. 並列処理との違い
イベントソーシングを知ろう ~ステートソーシングとの比較とGoでの簡単な実装例つき~
イベントソーシングとは、データベースに保存するデータをイベントの形式で保存することです。イベントソーシングを使うことで、データベースの状態をイベントの履歴から再現することができます。
CRUDのようにデータベースの状態を直接変更するのではなく、イベントを発行してデータベースの状態を変更します。イベントソーシングを使うことで、データベースの状態を変更する操作をイベントの履歴として保存することができます。
ステートソーシングとイベントソーシングの違いは、データベースの状態を直接変更するのではなく、イベントを発行してデータベースの状態を変更する点です。イベントソーシングを使うことで、データベースの状態を変更する操作をイベントの履歴として保存することができます。
ステートソーシングにおいて履歴をトレースするためには、データベースの状態を保存するためのテーブルを作成したりロギングを行って時系列で解析する必要があります
この特徴から、イベントソーシングは、データベースの状態を変更する操作をイベントの履歴として保存することができるため特定の時点でのデータベースの状態を再現することが容易で
【Go】Go1.22で試験導入されたrangefuncを理解したい!
# はじめに
こんにちは、H×Hのセンリツ大好きエンジニアです。(同担OKです😉)
今回は、Go Conference 2024でも取り上げられていた`rangefunc`という新たな機能について自分なりにまとめたので、そちらをご紹介します!# rangefuncとは?
公式リファレンス参照:https://go.dev/wiki/RangefuncExperiment
> For a future Go release, the Go team is considering adding range-over function iterators. Go 1.22 contains a preliminary implementation of the change, enabled by setting GOEXPERIMENT=rangefunc when building your program. We invite anyone who wants to help us understand the effects of the change to try using
Goでwebsocketを作ってみた
# どのような実現方法があるのか?
GPTによると…・Gorilla WebSocket: 高機能で安定しているが、やや複雑。
・nhooyr.io/websocket: シンプルでコンテキスト対応、軽量だが機能は少なめ。
・golang.org/x/net/websocket: 基本的な機能を提供するが、メンテナンス頻度が低い。
・github.com/gobwas/ws: 高速で低レベル制御が可能だが、学習コストが高い。
・github.com/olahol/melody: 使いやすく多機能だが、パフォーマンスやスケーリングの面で劣ることがある。# プロジェクトの作成
必要なければ飛ばしてください.
インストールしたけどパスが通っていなかった
# 起こったこと
“`bash
go install github.com/deepmap/oapi-codegen/v2/cmd/oapi-codegen@latestoapi-codegen -version
> command not found: oapi-codegen
“`oapi-codegenを使用してGoのコード自動生成を行おうとしていました。
インストールを実行したはずなのに、コマンドが見つからないようです。# やったこと
oapi-codegenはgoのバイナリファイルにインストールされるので、Goのパスを確認します。
“`bash
go env GOPATH
> /home/username/go
“`すでに通っているパスを確認します。
“`bash
echo $PATH
> /usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
“`この中にさきほど確認したGoのパスがないので、パスを通してやる必要が
Dockerで簡単なAPIサーバ(Go)を立てる
## 前提
main.goファイル、go.mod , go.sumファイルが同階層にある前提です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/76962e7d-7264-dfb5-b545-9ea037268017.png)以下を実施した後だとやりやすいです。
https://qiita.com/konnbu/items/76b977f715a13ec3bece
## Dockerfile 作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/2d225c90-d7bb-78f4-3a50-952198dbee13.png)main.goと同じ階層に作成しています。
“`
# FROM –> DocketHubからpullしてくるベースなるイメージの指定
# WORKDIR –> コンテナ起動後の作業ディレクトリ
# CMD –> C
Go&echoで簡単にAPI作成
作るものは「最低限必要なものを揃えたmain.go」のみ。
ゴールは「local起動し、ブラウザから確認」&「curlコマンドからAPIを叩けること」です。## フォルダ構成
めちゃ簡素。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/9b373c54-dc1c-34f2-c4ae-9f0cde3afd5a.png)つくりかた
1. main.go ファイルを作成
1. `go mod init` を実行、 go.mod, go.sum ファイルが生成される以上!
## main.go の中身
[こちらの記事](https://zenn.dev/def_yuisato/articles/echo-get-started)を参考にそのまま使わせていただきました。
今回はファイル名だけserver.go → main.goとしています。
ミドルウェアについて、それぞれ
“`
e.Use(middleware.Logger()) // ここからlogが取得
Go(guregu)+lambda+dynamoDBでデータのやりとりをしよう
## はじめに
この記事では、Go(guregu)を用いてLambdaを介し、DynamoDBとのデータのやりとりを紹介します。## lambdaを動かしてみよう
2023/12/31にLambdaのGoランタイムがサポート終了となりますが、buildしてLambdaへ渡すため、ランタイムは必要ありません。まずは簡単なコードから実行してみましょう。任意のディレクトリで以下のコマンドを実行して、プロジェクトを作成します。
まずは簡単なコードから実行していきましょう。
任意のディレクトリで
“`sh
$ mkdir go-lambda-test
$ cd go-lambda-test
$ go mod init test
“`
上から順に実行し、プロジェクトを作成していきます。
ディレクトリ直下にmain.goを作成し、以下のコードを記述します。
“`main.go
package mainimport (
“context”
“github.com/aws/aws-lambda-go/lambda”
)// ハンドラ関数を定義
func handler() (
Echo(Go)を使用してアプリを作成してみた【簡単なタスクのCRUD操作とJWPの認証機能】
##
## 参考サイト
[cho/Go + Reactで始めるモダンWebアプリケーション開発
](https://www.udemy.com/course/echo-go-react-restapi/learn/lecture/36949722?start=0#overview)
ゴルーチン(goroutine)について_1
# ゴルーチン(goroutine)
goの基本構文を学んでいくうえで今一つイメージが掴みづらかったゴルーチンについてまとめてみた。● ゴルーチン(goroutine)は、Go言語で並行処理を実現するための軽量スレッドである。
● ゴルーチンは、通常のスレッドよりも低コストで作成され、数千〜数百万のゴルーチンを簡単に起動できる。
● ゴルーチンは、キーワード「go」を使って関数呼び出しの前に指定することで作成される。
以下がコード例である
“`diff_go
func main() {
go hello()
}func hello() {
fmt.Println(“Hello, goroutine!”)
}“`
このコードでは、hello 関数が新しいゴルーチンとして実行される。main 関数が終了しても、ゴルーチンは実行を続ける。ゴルーチンは、Goのランタイムによってスケジュールされ、複数のゴルーチンが同時に実行されることがある。Goのランタイムは、マルチコアプロセッサの利用やブロッキングIOの効率的な管理など、ゴルーチンを効果的に処理する。ゴルー
Go言語で簡単に請求書を生成:Invoice Generatorリポジトリの紹介
請求書作成をもっと簡単にしたいと思いませんか?
[Quail](https://quail.ink “Quail.ink”) が提供する [Invoice Generator](https://github.com/quail-ink/invoice-generator “Invoice Generator by Quail”) を使えば、プロフェッショナルな請求書を簡単に生成できます。この強力で使いやすいライブラリをGo言語で活用して、請求書作成プロセスを効率化しましょう。
![](https://camo.githubusercontent.com/340c844b04bc236cb8b8bf11b44619c8b81ce7d3dbb1ac86125d8b6566948144/68747470733a2f2f7374617469632e717561696c2e696e6b2f6d656469612f717a35757a7635712e77656270)
### なぜこのInvoice Generatorを選ぶべきか?
**1. Go言語とシームレスに統合**
– 既存
AWS SDKのモック実装例
# はじめに
AWS SDKを使用したコードに対して高速且つ多様なケースの単体テストを実装するためのノウハウ(≒SDKの挙動のモック化)を、実装例と共に備忘録として残します。
—
## なぜAWS SDKをモック化したいのか
AWS SDKを使用したコードをモック化しないで単体テストしようとすると、以下のような点が実現性や生産性のボトルネックになりがちです。
– 実際にAWSリソースを操作しようとすると、手間と時間とコストが掛かる
– 実際のAWSのAPIから意図したレスポンス(例えば特定状況下でのエラーレスポンス)を返却させるのが困難、又は不可能
– セキュリティ上の都合でIAMやNWが制限されておりAWSのAPIの利用が不可能以上のような理由から、高速且つ多様なケースをテストするためにAWS SDKをモック化したい場合があります。
—
## 注意・免責事項
– この記事に記載している内容が唯一且つ最適解という訳では無いかも知れません。もっと効率的なやる方があるかも知れません
– モック化はあくまでも単体テストでのみ使用すべきであり、結合試験・E2E試験時
クリーンアーキテクチャに入門してみた
# はじめに
– クリーンアーキテクチャとはよく聞くけどいまいちわからないと思い調べてみた時のメモです
– 自分とは同じようにクリーンアーキテクチャについて聞いたこと、調べたことはあるけどいまいち理解できなかったという人の理解の助けになれば嬉しいです!
– 実装例はGo言語を使用しています### この記事から得られる内容
– アーキテクチャとは何か
– 一般的なアーキテクチャ、その課題と解決策
– クリーンアーキテクチャについて、各レイヤーの責務# アーキテクチャについて
### アーキテクチャとはなにか?
– ソフトウェア開発におけるアーキテクチャとは、システムの根幹となる構造を定義する「設計図」の役割です
– アーキテクチャは、システムを異なるパーツに分け、それぞれのパーツがどのように組み合わせられるかを決めます
– これがプログラミングの基本原則の一つである「関心事の分離」で、具体的には、各機能や役割を独立したモジュールやクラスにまとめることで、コードを他の部分と明確に分けることができます### アーキテクチャの目的
– アーキテクチャの目的は、ビジネスニー
github.com/kubernetes/client-go informers 和訳
K8s の client-go の informers の調査の一環としてこのドキュメントを読むことになりました。英語力に不安があるので、DeepL でベースの翻訳を行い、怪しい単語は手動で直したメモを書いていました。一般的な内容なので共有します。
**Version: v0.30.1** の内容です。
# informers
## Overview
`informers` は K8s の API 用に生成された informers を提供します
## Types
### type [`GenericInformer`](https://github.com/kubernetes/client-go/blob/v0.30.1/informers/generic.go#L77)
“`golang
type GenericInformer interface {
Informer() cache.SharedIndexInformer
Lister() cache.GenericLister
}
“`GenericInformer は SharedIn
Goのdefer実行タイミング
慣れている人からすると当たり前なんですが、冷静に考えると間違えそうだったので、備忘録。
## deferのタイミング
“`go: コード
func foo(str string) {
fmt.Println(str)
}func main() {
str := “でぃふぁー”
defer foo(str)str = str + “ぷりんと”
}
“`さて、この時表示する結果はなんでしょうか。
1. でぃふぁー
2. でぃふぁーぷりんと
3. ぷりんと
4. 空文字正解は
“`go: 結果
でぃふぁー
“`ですね。
defer関数の引数は実際の呼び出しが行われた時ではなく、deferステートメントが実行されたときに評価されます。
## return時はどうなるか
ではreturnがある場合先なのか、後なのかどちらでしょう。
“`go: コード
func hoge() string {
str := “でぃふぁー”
defer fuga()
fmt.Println(“りたーんまえ!”)
retu
GoのLambdaをGithub Actions + Terraformでデプロイする
# はじめに
Terrformを使ってインフラ管理しているのですが、Lambdaのデプロイにちょっと手間取ったので、記録を残しておきます。# 実現したいこと
– Github Actions + TerraformでLambdaをデプロイしたい
– LambdaコードはTerraformコードとは別ディレクトリで管理(同じリポジトリではある)
– 言語はGo
– Lambdaのコードに変更があった場合と、Terraform側のコードに変更があった場合のみデプロイが実行されるようにしたい# Github ActionsでTerraformを扱えるようにする
OIDCを使って、Github ActionsでTerraformを扱えるようにする記事は色々ありますので、細かい説明は割愛させていただきます。
# Terraform
terraformの階層と違う階層にLambdaのファイルを保存したいと思いますので、その前提で以下のようなコードになります。“`terraform
resource “terraform_data” “build_lambda” {
//
OpenAPIのyamlファイルとoapi-codegenでGoの自動生成をやってみた
# 環境
OS:Ubuntu22.04
Go:v1.20.3
oapi-codegen: v2.2.0# やったこと
タイトルにもあるとおり、[oapi-codegen](https://github.com/deepmap/oapi-codegen/tree/master)を使用してGoの自動生成の実行を行いました。基本的にはREADMEに従っただけですが、手順を書いておきます。
## oapi-codegenインストール
“`bash
go install github.com/deepmap/oapi-codegen/v2/cmd/oapi-codegen@latest
“`バージョン確認のコマンドでインストールができているか確認しましょう。
“`bash
oapi-codegen -version
> v2.2.0
“`## 生成したコードを入れるフォルダを作成
自動生成したコードを直接編集すると、再び自動生成を行った時に上書きする恐れや、上書きされるのを避けてyamlファイルの変更を手動で反映させる必要などがでてくることが考えられます。
そこで、自
Golang 並行処理(goroutine)を覚えよう!
## はじめに
2つ目の記事のテーマはgoroutineを使用した並行処理です。
Goの強みとして並行処理が得意なことは知っているけど、具体的な使い方がわからない、そもそも並行処理がどのようなものかもわからないという方向けの並行処理基礎講座です。ぜひ見ていってください。
## 並行処理とは
そもそも並行処理とは、コンピュータプログラムが同時に複数のタスクを実行できるようにする計算概念のことです。一般的なプログラミングモデルでは、処理は1つ1つ順番に実行されます。つまり、Aというタスクを実行した場合、途中でやめるか終了するまでBという次のタスクに移ることはできません。しかし、並行処理では、複数のタスクが同時に進行でき、各タスクの実行がお互いに干渉することも可能となります。並列処理との違い
並行処理はよく、並列処理と間違われることがあります。その実、並行処理と並列処理は、両方とも複数のタスクが同時に進行することを意味します。しかし、微妙な違いがあるのです。
簡潔に言えば、並行処理は複数のタスクが同時に進行しているように見えるが、実際には同時には実行されていない場合があり
Go テスト時の構造体の比較方法
# Goの構造体の比較の方法についてメモ
## 結論
go-cmp便利
シンプルな比較であればassert.Equalで十分。ちょっと複雑なことをやるならgo-cmpを使うとよい。
例えば以下はよくあるケースだと思う。
– 日付など特定のカラムを除外して比較したい
– 構造体の配列の比較の際に並び順は無視して比較したい## 調べた経緯
比較するのはいくつか方法があるのでどれが良いのか気になったため。– ObjectsAreEqual
https://pkg.go.dev/github.com/stretchr/testify/assert#ObjectsAreEqual– assert.Equal(内部でObjectsAreEqualを呼びだしている)
https://pkg.go.dev/github.com/stretchr/testify/assert#Equal– DeepEqual
https://pkg.go.dev/reflect#DeepEqual– go-cmp
https://pkg.go.dev/github.com/google/go-
Goのpackageでつまづいた
## やりたかったこと
main.goにながーく書いてある状態から、このようなディレクトリ構成にしたいと考えた。
“`
repository
├── cmd
│ ├── main.go
│ └── main_test.go
├── internal
│ └── hoge.go
└── go.mod
“`
“`go.mod
module github.com/hoge/repositorygo 1.22.3
“`
“`main.go
package mainimport (
“fmt”
“github.com/hoge/repository/internal”
)
// 以下略
“`
このような構成に変えたあとgo mod tidyしたらエラーが出た。## 原因
デフォでmainブランチ(作業しているのとは別)から取得しているので、packageが見つからないらしい。## 解決策
そもそも、流用ができなさそうなファイルだったので、ローカルで参照すればいいと考えた。
まず、go mod init repositoryで変える。
“`
GOでAPI作成.PostgreSQL+GIN
# go初期設定
go言語のインストールはこちらからインストール出来たら.
“`
mkdir myproject
“`
“`
cd myproject
“`
“`
go mod init example.com/myproject
“`
“`
go get -u github.com/gin-gonic/gin
“`
“`
go get -u github.com/joho/godotenv
“`
“`
go get -u github.com/jackc/pgx/v4
“`
# ファイル構造
“`
C:.
│ .env
│ go.mod
│ go.sum
│ main.go
│
├─config
│ config.go
│
├─controllers
│ user_controller.go
│
├─database
│ database.go
│
├─models
│ user.go
│
├─repositories
│ user_