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

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

Go (Gin Web)でサーバーキャッシュを扱う

# Go (Gin Web)でサーバーキャッシュを扱う
Goでサーバーキャッシュを扱うときの方法を簡単にまとめます。
大規模のトラフィックを捌くときにお役に立てばと思います。
フレームワークはGin Webを利用する想定です。

## main.goでキャッシュの接続を記述
“`go:main.go
package main

import (
“os”
“time”
“tkol-lite/controllers”
“tkol-lite/models”
“tkol-lite/services”

“github.com/gin-contrib/cors”
“github.com/gin-gonic/gin”
)

func main() {

os.Setenv(“TZ”, “UTC”) // タイムゾーンの設定
r := gin.Default()

r.Use(cors.New(cors.Config{

AllowOrigins: []string{ // アクセスを許可したいアクセス元
“http://example.com”,
},

元記事を表示

prisma-client-goを使ったDocker環境の構築から初期設定、テストデータ投入、接続、使用法まで徹底解説!

## 概要
GOのDocker環境を使ったPrismaの
– 初期設定
– テストデータ作成と投入
– Prisma Clientとの接続
– Prismaの使用(今回は一覧表示APIを作成しながら解説します)

方法について解説します

## 前提
– フレームワークはGinを使用します
– DBはPostgresを使用します

## ディレクトリ構成
“`
tree
.
├── .env
├── .gitignore
├── README.md
├── application
│ ├── config
│ │ ├── database.go
│ │ └── passwordManagement.go
│ ├── controllers.go
│ ├── go.mod
│ ├── go.sum
│ ├── main.go
│ ├── prisma
│ │ ├── schema.prisma
│ │ └── seed.go
│ ├── routes.go
│ ├── services.go
├── containers

元記事を表示

Go開発環境でJWTの導入

# はじめに
今回はGo言語で作ったAPIにJWTを実装していきます。
要素検証のみのため簡単な構成で進めます。

### JWTとは
JSON Web Tokenの頭文字を取ってJWT(ジョットと読む)と呼びます。
これは情報を安全に送受信するためのオープンスタンダード(RFC 7519)です。短くてコンパクトなJWTは、HTTPヘッダーやクエリストリングで確実に情報を送ったり、受け取ったりすることが可能です。主にユーザー認証や情報交換のために使われます。JWTは「ヘッダー」「ペイロード」「シグネチャー」の3部分で構成されており、それぞれがBase64Urlでエンコードされています。

詳しくはこちら。

https://ja.wikipedia.org/wiki/JSON_Web_Token

# 検証環境

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

https://qiita.com/sedori/items/fee189944293cd9c72c5

# 前提条件

ログイン機能の実装が完了しており、次のコマンドでログイン用のアカウントが作成されていることを前提としています

元記事を表示

CDK×Lambda×golang×Dynamoでアプリを作ってみる DynamoDB処理のLambda実装編GET&POST(第四回)

さて、今回は以下のようにファイルを記述してAPIGatewayで用意したエンドポイントへアクセスし、DynamoDBのレコードを作成&取得できるようにしていきます。長くなってしまうので今回はGETとPOSTをまずは作成し、次回更新と削除を実装していきたいと思います。

いつも通り詳しい解説をしていきます。
“`lambda/dynamoDBHandler/main.go
package main

import (
“github.com/aws/aws-lambda-go/events”
“github.com/aws/aws-lambda-go/lambda”
“github.com/aws/aws-sdk-go/aws”
“github.com/aws/aws-sdk-go/aws/session”
“github.com/aws/aws-sdk-go/service/dynamodb”
“github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute”
“encoding/json”
“net/http

元記事を表示

【もしかして】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
go get github.com/gorilla/websocket
go run main.go
“`
②main.goを作成する

“`backend/main.js

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

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

“`
“`
cd backend
go mod tidy
“`
④backendにwebsocket/client.goを作成する

元記事を表示

複数バージョンの 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

元記事を表示

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

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

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

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

## どういった事ができるのか
非常にシンプルで、ただこれだけ。
**localstack(S3)操作を、AWS CLI固有のコマンドを利用せずに使い慣れたlinuxコマンドで行える。**

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


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

元記事を表示

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

元記事を表示

OTHERカテゴリの最新記事