Go関連のことを調べてみた

Go関連のことを調べてみた

クリーンアーキテクチャに入門してみた

# はじめに

– クリーンアーキテクチャとはよく聞くけどいまいちわからないと思い調べてみた時のメモです
– 自分とは同じようにクリーンアーキテクチャについて聞いたこと、調べたことはあるけどいまいち理解できなかったという人の理解の助けになれば嬉しいです!
– 実装例は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/repository

go 1.22.3
“`
“`main.go
package main

import (
“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_

元記事を表示

GOをHerokuにデプロイする際の「Permission denied」

# エラー内容

### エラーコード
“`
C:\Users\myname\GitHub\study_go>heroku restart –app go-api
Restarting dynos on ⬢ go-api… done

C:\Users\myname\GitHub\study_go>heroku logs –tail
2024-06-10T17:43:11.476157+00:00 app[web.1]: /bin/bash: line 1: ./starter: Permission denied
2024-06-10T17:43:11.523112+00:00 heroku[web.1]: Process exited with status 126
2024-06-10T17:43:11.546061+00:00 heroku[web.1]: State changed from starting to crashed
2024-06-10T17:43:11.548837+00:00 heroku[web.1]: State chan

元記事を表示

【Go】gorm × Atlasで始めるマイグレーションのバージョン管理

# はじめに
こんにちは、H×Hのセンリツ大好きエンジニアです。(同担OKです😉)

今回はGoのマイグレーションツール**Atlas**の始め方について記事を書きました!
(記事キャンペーンに投稿してQiitaオリジナルグッズが欲しいのは内緒🤫)

背景として、gormをORMに使用していたのですが、マイグレーションをバージョン管理したいな。。。という願望がありましたのでAtlasを始めました!

# Atlasとは?
公式サイト:[atlas](https://atlasgo.io/)

Atlasは、データベースのマイグレーションツールになります。
バージョンマイグレーションと、宣言的マイグレーションの2通りが使用できる&多機能になっているのでかなりオススメです!

– バージョンマイグレーション:マイグレーションをバージョン管理する
– 宣言的マイグレーション:現状のスキーマファイルとDBを比較して内部的に変更を検知した上でマイグレーションが実行される

様々な言語のORMに対応していますが、今回はgormでバージョンマイグレーションを行います。
また、MySQLを始めとした様

元記事を表示

DockerでGo言語の開発環境構築

# はじめに
現在python、djangoでのwebアプリ開発をしているのですが
ちょっとした気分転換に前から興味があったdocker、goについて
環境構築をしていこうと思います。

# 1.Windows+WSL2上でDockerを使えるようにする手順
## WSLとは
WSLとは「Windows Subsystem for Linux」の略で、言葉の通りwindowsのサブシステムとしてlinuxを使用できるようにするためのシステムです。
WSLをインストールすることでWindows上でLinuxを利用できるようになります。

## Dockerとは
1つのサーバで複数のアプリケーションを仮想化できるプラットフォームです。
簡単に言えばコンテナごとに環境がつくれて、その環境を他の人と共有することができるサービスです。
コンテナとは部屋のようなもので、部屋ごとにjavaやらpythonやらの環境をつくりその部屋をルームシェアできるよということです。一人ずつ環境をつくるとうまく動かない場合があるので、環境を共有できると便利だよねって感じ。

## 構築手順
構築手順は以下の記事を参

元記事を表示

Jupyterカーネル自作入門

この記事は2022年9月10日から開催された技術書典13にて頒布した「KLabTechBook Vol.10」に掲載したものです。

https://makiuchi-d.github.io/2024/06/04/klabtechbook10-jupyter-kernel.ja.html

元記事を表示

オンライン対戦を支える独自シリアライズフォーマット

この記事は2022年1月22日から開催された技術書典12にて頒布した「KLabTechBook Vol.9」に掲載したものです。

https://makiuchi-d.github.io/2024/06/02/klabtechbook9-wsnet2-serializer.ja.html

元記事を表示

【Go】PokeAPIで学ぶGo言語 ~ゴルーチンで並行処理を実装、ベンチマークテストで比較~

# この記事の内容
* 3つのエンドポイントからそれぞれポケモンの日本語名取得、画像取得、データ取得している処理をゴルーチンで並行処理で行うようにする
* Goの標準のテストパッケージのベンチマークテストを行い、並行処理実装前と比較を行う

## 並行処理を行う前のソースコード
“`handler.go
// GetPokeDataHandler ポケモンのデータを取得する。
func GetPokeDataHandler(w http.ResponseWriter, req *http.Request) {
var err error
var pokeParams models.PokeParams
var pokeData models.PokeData

//クエリパラメータからレベル、努力値、個体値を取得
query := req.URL.Query()
keys := []string{“lv”, “ef”, “in”}
pokeParams, err = GetQueryParams(query, keys)
if err != nil {
http

元記事を表示

Ginを使ったWeb APIをreleaseモードで起動する方法と、環境変数の使い分け

# はじめに

Ginを使ったWeb API起動時には、基本的に以下の文が表示されます。

“`
[WARNING] Running in “debug” mode. Switch to “release” mode in production.
“`

これは開発環境なら問題ありませんが、デプロイの際にはreleaseモードとして起動する必要があるということです。

そこで、releaseモードでの起動方法と、ついでに環境変数の使い分けについて紹介しようと思います。

***バージョン一覧***
| 使用技術 | バージョン |
|:-:|:-:|
| go | 1.22.0 |
| gin | 1.9.1 |
| godotenv | 1.5.1 |

# releaseモードでの起動

これは簡単で、起動時のコマンドを以下のようにするだけです。

“`
GIN_MODE=release go run cmd/main.go
“`

このコマンドによって起動すると、起動時に
“`
[GIN-debug] GET ~
[GIN-debug] GET

元記事を表示

Go(Gin)を用いてDBサーバからデータを取得する(Herokuデプロイまで)

この記事ではGoのginフレームワークを用いてデータベースサーバーからデータを取得し,JSON形式で表示することを目標とする.今回はdockerで環境構築をする.DBMSはPostgreSQLを用いる.
>goのバージョンは`1.22`を用いる

# Dockerで環境構築
まずプロジェクトディレクトリを作成する.
“`
mkdir yourprojectname
cd yourprojectname
“`
goプロジェクトを始めるために新しいGoモジュールを初期化する
“`
go mod init example.com/yourprojectname
“`
次にginフレームワークをインストールする.
“`
go get -u github.com/gin-gonic/gin
“`

DBサーバー(PostgreSQL)からデータを取ってくるための依存関係を追加する.
“`
go get github.com/lib/pq
go get golang.org/x/net
“`
:::note info
`go get github.com/lib/pq`
Go言語で

元記事を表示

【Go】mockgenでディレクトリ内のファイルからモックを一度に作成するスクリプト

# mockgenとは?
Goでモックを作成するためのパッケージです。
※ `golang/mock/mockgen`はアーカイブされているため、使用するのは`go.uber.org/mock/mockgen`になります。

インストールは以下のコマンド
“`zsh
go install go.uber.org/mock/mockgen@latest
“`

モックを作成する際は、以下のコマンドのように一つづつ作成するが、正直めんどくさいですよね😇
“` zsh
mockgen -source=foo.go [other options]
“`

という事で、対象ディレクトリ内のファイルを全てモック化してもらいましょう😎

# ディレクトリ内のファイルから一度にモックを作成するスクリプト

“` shell
#!/bin/bash -eu
# 環境変数設定
ROOT=対象のルート
MOCK_DATA_ROOT=”モックを格納するディレクトリ”

# ROOTのモック化したいファイルのあるディレクトリ一覧
# この例では、usecaseとrepositoryディレクトリ配下のフ

元記事を表示

makeとappendの特性と理解

## 実装

“`go
s := make([]int, 5)

s = append(s, 1, 2, 3)
fmt.Println(s)

// [0 0 0 0 0 1 2 3]
“`

上記はmakeメソッドでスライスを作成しました。第一引数を省略するとlenが5のスライスが作成されます。その結果ゼロ値`[0, 0, 0, 0, 0]`となります。そこに上記のようなappendメソッドで要素を実行すると、余計なゼロ値に値が加わってしまいます。対策としては、下記のような記述になります。

“`go
s := make([]int, 0, 5)

s = append(s, 1, 2, 3)
fmt.Println(s)

// [1 2 3]
“`

上記の実装だとmakeメソッドで、len0でcap5のスライスが作成されます。その結果`[]`となります。そこに上記のようなappendメソッドで値を追加すると、余分なゼロ値を取り除いたスライスが作成できます。

## 参考記事

[Go言語のmakeについて – Qiita](https://q

元記事を表示

Goのinterfaceを覚えよう!

はじめに

初めまして。Goを始めて2か月の新人プログラマーです。
このアカウントでは、自分が詰まった箇所を後で見返せるように
メモとして残しておきます。
今回はinterface編です!

そもそものinterfaceの定義

公式情報によると、interfaceとは、「メソッドのシグネチャの集まり」と
書かれています。なんのこっちゃですよね。
要約すると、そのメソッドの集まりを実装した値を、interface型の変数へ
持たせることができるということです。

実際に使ってみた

“`Go:main.go
package main

import “fmt”

type I interface {
M()
}

type T struct {
S string
}

func (t T) M() {
fmt.Println(t.S)
}

func main() {
var i I = T{“hello”}
i.M()
}
“`

これは公式からコピペしただけのコード

元記事を表示

OTHERカテゴリの最新記事