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

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

【もしかして】APIテストの事例ってあんまりない😨【えっ!?】

## はじめに

多くの方が、E2Eテストと聞くとフロントの画面のテストを思いつくと思いますが、今回は、バックエンドのE2Eテストについてやってこと、調べたこと、導入してみての結果を書いていこうと思います。

よろしければ、最後までお読みください!
そして、いいね❤️もよろしくお願いいたします!

## 対象読者

– 急にAPIのE2Eテストのタスクが降ってきた方
– バックエンドエンジニア
– Scenarigoに興味ある方

## TL;DR

– APIテストに **scenarigo** オススメ
– aws sigv4を突破するのにproxyという選択もある

**以上**

## 今回導入するシステム

– とある業務DX系SaaS

### 雑な構成と今回のテスト範囲は以下の通り

よくある、っていうか個人開発でも使われるような **The Serverless** な構成
テスト範囲は、クライアントからAPIGateway → ECS → RDSの環境で期待するAPIの

元記事を表示

Go言語でログイン機能を実装してみた

# はじめに

Go言語で簡単なログイン機能(サインアップ、サインイン)を実装したときのお話
今回も要素検証だけですので、単純構成で作っています

# 検証環境

こちらの記事で構築した環境を利用しました。

https://qiita.com/sedori/items/840e39a0cbf9d5bff006

# ディレクトリ構成

“`shell
go-gin-gorm
├── tmp
├── .air.toml
├── docker-compose.yml
├── Dockerfile
├── go.mod
├── go.sum
├── libraries
│ └ crypto.go
└── main.go
“`

# 実行条件

“`shell
Golang v1.22.3
Gin v1.10.0
GORM v1.25.10
MySQL 8.0.29
“`

# ログイン機能の実装

~~サインインを確認するために実装した~~サインアップとサインインの実装例を以下で示します。

### パスワードの暗号化

暗号化にはbcryptを使用しています。
bcr

元記事を表示

gRPCの通信をGo(サーバー)とNode.js(クライアント)で実装してみる。

# Go言語を勉強してみる。
JavascriptとかPHPとか自分がよく知っている言語以外で、あたらしいモノに触れてないなと思い、今になってGoogleが開発したというGoに触れてみている。いろいろ調べていく中でおなじくGoogleが開発したというgRPCというのが出てきたので、どんなものか自分でも実装してみる。

サーバー/クライアントともGo(あるいはNode.js)という記事はいくつかあったが、違うサービス間で通信してるっぽくなるように、あえて違う言語で試した。

Nodeは元からホストにインストールしていたものの、Goはインストールしてなかったので、ここではDockerコンテナを用意した。

# 全体の構成

Dockerコンテナ側に配置するサーバープログラム。

“`
root/
├─docker-compose.yml
├─Dockerfile
├─.env
└─src/
├─go.mod
└─gRPC/
├─grpc_sample/
├─server.go
└─ex.proto
“`

ホスト側に配置

元記事を表示

Borgoを使ってRust風のコードからGoのコードを生成する

[Borgo](https://github.com/borgo-lang/borgo) というプログラミング言語を使ってみました。

Borgo は Go のトランスパイラで、JavaScript に対する TypeScript のような位置付けのものですが、Go の構文拡張ではなく Rust に似た構文を採用している点が特徴です。

Go の型まわりやエラーハンドリングの不満点を解決するためのものだと思われますが、現時点(2024-05-26 時点)では考慮不足や不備が散見され、まだまだ完成度は低そうでした。

また、あくまでも Rust 風の構文のため、Rust と微妙に違っていたりもします。

# 準備

まず、Borgo のコンパイラを使えるようにします。

現時点でビルド済みバイナリの配布は見当たらなかったため、github からソースコードを取得してビルドしました。

Borgo コンパイラ自体は Rust で実装されており容易にビルドできます。

“`sh:ソースコードの取得
$ git clone https://github.com/borgo-lang/borg

元記事を表示

GoとGinでRESTful APIを開発する

:::note info
この記事は、Goの公式が提供している、**Tutorial: Developing a RESTful API with Go and Gin** を日本語に訳したものです。
:::

https://go.dev/doc/tutorial/web-service-gin

# Tutorial: Developing a RESTful API with Go and Gin

このチュートリアルでは、Goと[Gin Web Framework](https://gin-gonic.com/docs/)(Gin)を使ってRESTfulなWebサービスAPIを書く基本を紹介します。

Ginは、Webサービスを含むWebアプリケーションの構築に関連する多くのコーディング作業を簡素化します。このチュートリアルでは、Ginを使ってリクエストをルーティングし、リクエストの詳細を取得し、レスポンス用のJSONをマーシャルします。

このチュートリアルでは、2つのエンドポイントを持つRESTful APIサーバーを構築します。サンプルプロジェクトは、ビンテージジャズのレ

元記事を表示

goでプロジェクトを立ち上げる:hello, world!

### Go言語のインストール
Goの公式サイトからインストーラをダウンロードし、インストールする。
### プロジェクトのディレクトリを作成:
作業したい場所にプロジェクト用のディレクトリを作成する。
“`shell:zsh
% mkdir go_sample && cd go_sample
“`
### Go Modulesの初期化
プロジェクトディレクトリ内で以下のコマンドを実行し、モジュールを初期化する。
“`shell:zsh
% go mod init go_sample
“`
% プログラムの作成
main.go ファイルを作成し、基本的なプログラムを記述する。
“`go:main.go
package main

import “fmt”

func main() {
fmt.Println(“Hello, World!”)
}
“`
### ビルドと実行
プロジェクトディレクトリで以下のコマンドを実行し、プログラムをビルドして実行する。
“`shell:zsh
go build
# 生成されたバイナリファイルを実行
./go_sample
“`

元記事を表示

Golang+Reactでアプリを作成してみた【Realtime Chat App】

## Technology used
golang
goroutines
websockets
webserver
channels

Frontend
react

## backendを作成

①backendディレクトリとmain.jsを作成
“`
# バックエンド用のディレクトリを作成
mkdir backend
touch main.go
cd backend
go mod init chatapplication
“`
②main.jsを作成する

“`backend/main.js

“`
③backend内にwebsocketフォルダとwebsocket.goを作成する

“`
mkdir websocket
touch websocket.go
“`
“`backend/websocket/websocket.go

“`
“`
cd backend
go mod tidy
“`

## 参考サイト
[GO + REACT Fullstack App – Chat Application PART- 1 I

元記事を表示

複数バージョンの Go

これも何度も忘れるのでメモする。

* Go のインストーラを使うと、Go は `/usr/local/go` にインストールされる。
* あとで別のバージョンのインストーラを使うと、`/usr/local/go` は削除される。
* go install コマンドでインストールすると、Go は `~/go/bin` と `~/sdk` にインストールされる。

例えば 1.21.4 を使いたい時はこうする。なぜ二度コマンドが必要なのかは不明。

“`shell
go install golang.org/dl/go1.21.4@latest
go1.21.4 download
“`

.zprofile など設定ファイルの中で alias をつけると便利。

“`
export PATH=”$PATH:$HOME/go/bin”
alias go=”go1.21.4″
“`

Go では後方互換性が保証されているので複数の Go を入れる動機は無さそうだが、プロジェクトで使う Go のバージョンが決まっている場合にうっかり新しい機能を入れたくない場合にやっぱり複数の

元記事を表示

SQLBoiler (高度な利用例)

# 環境

– [SQLBoiler](https://github.com/volatiletech/sqlboiler) v4

# はじめに

[SQLBoiler の README](https://github.com/volatiletech/sqlboiler) 及び、そこからリンクが貼られているコンテンツを読めばここに書いていることは網羅されていますが、初見では少し分かりづらいところ、少し複雑なユースケースをまとめています。

# Bind 利用例

カスタムの struct にデータをマッピングする場合、`Bind` を使う必要があります。
以下、[README → Videos](https://github.com/volatiletech/sqlboiler?tab=readme-ov-file#videos) の内、[SQLBoiler: Advanced Queries and Relationships](https://www.youtube.com/watch?v=iiJuM9NR8No) の25分目付近から説明されている内容を、まとめたものです。

元記事を表示

【Go】Gormでクエリーの結果を構造体に詰めたいけど何を使えばいいんだっけ?ってよくなるのでまとめました

## はじめに
普段の開発でORMにGormを採用しているのですが、クエリー結果を構造体へ詰めるために、`First`、`Take`、`Find`のどれを使えばいいのかついつい忘れちゃうことがありました。また、条件に合うレコードが見つからなかった場合に`Take`はエラーを返した気がするけど、`Find`はどうだっけ…ともなっていたので、今回備忘録がてらまとめてみました。

## 結論
単体オブジェクトを取得したい場合は、`Take`, `First`, `Last`を使い、複数オブジェクトを取得したい場合は、`Find`, `Scan`を使う。
`First`, `Take`, `Last`は条件に合うレコードが存在しなかった場合、`ErrRecordNotFound`を返却するが、`Find`, `Scan`は何も返さない。

:::note info
`Find`, `Scan`は単体オブジェクトに対しても使用可能です。
`db.Limit(1).Find(&user)`とすることで、`Take`と同様のSQLが流れますが、エラーは返りません。
以下で詳しく説明していきます。

元記事を表示

Go言語のGORMライブラリの規則でハマった(テーブル名編)

# はじめに

Go言語で開発されたORM (Object-Relational Mapping)ライブラリであるGORMで用いられるテーブル名に少しハマったのでメモしておきます。

### GORMとは
Go言語で開発されたORM (Object-Relational Mapping)ライブラリです。

https://gorm.io/ja_JP/docs/index.html

# 検証環境

こちらの記事で構築した環境を利用しました。

https://qiita.com/sedori/items/840e39a0cbf9d5bff006

# 問題点(ハマったポイント

GORMライブラリのドキュメントには次のような記載がありました。

:::note warn
テーブル名: デフォルトでは、GORMは構造体名を スネークケース に変換し、テーブル名を複数形にします。 例えば、 User 構造体は、データベースの users テーブルになります。
:::

https://gorm.io/ja_JP/docs/models.html

これ、少し気になりますよね。

というの

元記事を表示

GoでのJSON エンコードとデコードの基本

## はじめに

この記事では、Goを使用してJSON形式のデータする方法について解説します。標準ライブラリである`encoding/json`パッケージを使用して、Gonoデータ構造とJSON形式のデータを相互に変換する方法をサンプルコードを用いて説明します。

### 想定読者
– Go構造体 <-> JSON形式の変換方法を知りたい駆け出しGopher
– Goの構造体型への基本的な理解
– JSONが何かわかる

### 記事の狙い
– Go言語におけるJSONのエンコードとデコードの基本的な使い方を理解する

## 結論

– 構造体タグを使ってJSONオブジェクトのフィールドとGo構造体のフィールドをマッチングする
– `json`というタグ名を使ってJSONフィールドを指定する
“`go
// 構造体タグを使ったフィールド名の指定
type Person struct {
Name string `json:”name”`
Age int `json:”age”`
Email string `json:”email”

元記事を表示

ピュアP2P分散マイクロブログシステム NostrP2Pを作ってみた

こんにちは。 ryo_grid です。

今回はピュアP2P分散マイクロブログシステム NostrP2Pというものを作ってみたのでそれについて書いてみます。

– ひとまず開発物のGitHubリポジトリはこちら
– [ryogrid/nostrp2p](https://github.com/ryogrid/nostrp2p)
– [ryogrid/flustr-for-nosp2p](https://github.com/ryogrid/flustr-for-nosp2p)

アイキャッチ画像です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12325/9fce752c-3d73-fa48-10ea-0770330a3b38.png)

# 前提知識
– [Nostr](https://github.com/nostr-protocol/nips) プロトコルについてのざっくりとした理解
– [こちらの記事](https://zenn.dev/mattn/ar

元記事を表示

AWS LocalStack(S3)操作を簡単にするツール作った

## go-filesystem: AWS LocalStack操作をシンプルにするツール

今回は、私が開発したGo製のツール「go-filesystem」を紹介します。このツールを使えば、ローカルで立ち上げたLocalStackの操作を、AWS CLIを用いずにLinuxのコマンド(例: `ls`や`touch`)を使って簡単に行うことができます。

https://github.com/kinshotomoya/go-filesystem?tab=readme-ov-file#go-filesystem

### はじめに

LocalStackは、AWSサービスのローカル環境を提供する素晴らしいツールです。しかし、AWS CLIを使用するのは煩雑で、コマンドを覚えるのが大変なことがあります。そこで、もっと使い慣れたLinuxコマンドで操作できるツールを開発しました。

以下のようなaws cliコマンドをいちいち打つ必要はなくて


“`shell
aws –endpoint-url=http://localhost:4566 s3 ls s3://my-bucket/m

元記事を表示

Go+Gin+GORMでDocker開発環境構築

# はじめに
Go言語でAPIの開発環境を構築するにあたって、Go+Gin+GORM(+air)の備忘録として残しておきます。

### GO言語とは
Google が開発したプログラミング言語であり、「Go言語」や「Golang」と表記されます。

https://go.dev/

### Ginフレームワークとは
Go言語で書かれた Web フレームワークの1つです。
パフォーマンスに優れているため、API開発にも利用されます。

https://gin-gonic.com/ja/

### GORMライブラリとは
Go言語で開発されたORM (Object-Relational Mapping)ライブラリです。

https://gorm.io/ja_JP/docs/index.html

### air
Go言語のホットリロードツールです。ホットリロードというのは「開発中のコード変更が即座に反映され、アプリを再起動することなく、リアルタイムなプレビューが可能な機能」のことです。

https://github.com/cosmtrek/air

# セットアップ

###

元記事を表示

GomailとMailCatcherを使ってメール送信機能を実装しよう!

## 概要
GomailとMailCatcherのコンテナを使ってローカル上でメール送信機能を使用する方法について解説していきたいと思います

## 前提
– フレームワークはGinを使用
– 本記事はローカル環境でメール送信機能を試す方法について記載していますので本番環境では別のツールを使用してください
– docker-compose.ymlを使ってMailCatcherを構築します

## ディレクトリ構成
“`
tree
.
├── .env
├── .gitignore
├── Makefile
├── README.md
├── application
│ ├── .air.toml
│ ├── controllers.go
│ ├── emails.go
│ ├── go.mod
│ ├── go.sum
│ ├── main.go
│ └── routes.go
├── containers
│ ├── go
│ │ └── Dockerfile
│ └── postgres
│ └── Dockerfile

元記事を表示

CDK×Lambda×golang×Dynamoでアプリを作ってみる DynamoDB編(第二回)

さて、今回は以下の記事に続けて第二弾DynamoDBのスタックをCDKで追加していく。

https://qiita.com/YokoYokoko/items/c1fecc3278197ca43050

まずは以下をimportに追加して`go mod tidy`を実行
“`
“github.com/aws/aws-cdk-go/awscdk/v2/awsdynamodb”
“`

さて、まずはコードの全体像からです。
今回は以前のコードの追加していますが、まあほとんど似たような箇所が多いので前回よりも理解は楽になりましたが、Dynamoの設定値があるのでそちらの方も踏まえて見ていこうと思います。追加などわかりやすいように改行や並び順が変だったりします。

ちなみに私のDynamoDBの知識は2年前にSAPを取得した時の枯れた知識と先日再度キャッチアップした時の以下の記事レベルです。ほとんど入門者です。

https://qiita.com/YokoYokoko/items/8f0a19b0da69dc28f512

“`
package main

import (
“lo

元記事を表示

DockerとGormを使ってデータベース(Postgres)への接続とMigrationを実行しよう!

## 概要
Docker環境でGormを使ってデータベースへの接続とマイグレーションを行う方法について解説します

## 前提
– WebフレームワークはGin、DBはPostgresを使用
– GormとPostgresのドライバーをインストール済み
– Docker環境を構築している前提で解説するので今回はDockerfileとdocker-compose.ymlの書き方については解説しませんのでご了承ください

## ディレクトリ構成
“`
❯ tree
.
├── .env
├── .gitignore
├── Makefile
├── README.md
├── application
│ ├── .air.toml
│ ├── config
│ │ └── database.go
│ ├── go.mod
│ ├── go.sum
│ ├── main.go
│ ├── models.go
├── containers
│ ├── go
│ │ └── Dockerfile
│ └── postgres
│ └

元記事を表示

関数を引数として渡す方法(Go言語)

Go言語では、関数を他の関数の引数として渡すことができます。これは高階関数(higher-order functions)と呼ばれ、関数型プログラミングの強力な機能の一つです。

### 基本的な使い方についての例

まず、関数を引数として渡す基本的な方法を見てみましょう。以下は、簡単な例です。

“`go
package main

import (
“fmt”
)

// 関数型の定義
type operation func(int, int) int

// 関数を引数に取る関数
func compute(a int, b int, op operation) int {
return op(a, b)
}

// 足し算の関数
func add(x int, y int) int {
return x + y
}

// 引き算の関数
func subtract(x int, y int) int {
return x – y
}

func main() {
a, b := 5, 3

// 足し算を実行
sum :=

元記事を表示

Go 基礎

# はじめに
初めまして!WebエンジニアになりたいK.Yです!
今回は、まだ基礎を勉強中であるGoについて書きたいと思います!
※認識間違ってたら、コメントしてくれると有り難いです:bow_tone1:

# Goのプログラムの構成
Goは、変数や関数の全てのプログラムの要素は何らかのパッケージに属しています!
その為、プログラムはパッケージの宣言から始まります。

以下のようにpackage mainと記述することで、そのファイルはメインパッケージに
関するプログラムであることを宣言しているということです。
“`
package main
“`

続いては、main関数です。
こちらはエントリーポイントと呼ばれていて、プログラムの本体となります。
何かを出力したい時は、このmain関数の中に記述します。

“`
func main() {

}
“`

# GoでHello Worldと出力してみた!
Goでは出力用の関数を纏めたパッケージが装備されているので、そのパッケージを
インポートする必要があります!

まずはパッケージのインポートをしていきます。
fmt

元記事を表示

OTHERカテゴリの最新記事