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

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

ゴルーチン(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/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言語で

元記事を表示

OTHERカテゴリの最新記事