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

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

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
“`

元記事を表示

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

# はじめに

[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分目付近から説明されています。

以下、複数テーブルから値を返したい場合の例(↑の y

元記事を表示

【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

元記事を表示

Go言語とは

# はじめに
こんにちは!WebエンジニアになりたいK.Yです!
今回はGo言語について学んだことを書きたいと思います。
※認識が間違ってたら、コメントしてくれると嬉しいです:grinning:

# Goとは
Go言語とは、2009年にGoogleによって作られたオープンソースの静的付けプログラミング言語です。
Go言語は、コマンドツールライン、Webアプリケーション、クラウドやコンテナ技術などに使われています。
YouTubeやメルカリ、クックパッドなど、大規模なユーザー数を誇るサービスの開発に使用されています。

# Go言語のメリット
– シンプルで可読性の高いコードを書きやすい。

Goはコードを書く自由度が高くない。

そのため、誰が書いても同じ様なコードになりやすい。

複数人でコードを書いても、作業効率は落ちにくい。


– 実行速度が速い

コンパイル速度が早く、コンパイル済みのプログラム実行速度もC言語に迫る速さ。

処理が高速なので、プロダクトのパフォーマンス改善にも大きく期待できる。


– エラーがわ

元記事を表示

【GO言語】init関数の使い方

# はじめに

Go言語のinit関数についてまとめました。

## init関数とは?

アプリケーションの状態を初期化するために用いられる関数。パッケージ変数の初期化などに使われる。引数を取らず、何も値を返さない。パッケージが初期化→パッケージ内の全ての定数と変数宣言が評価→init関数の実行。

“`go
// 2番目に実行
func init() {
fmt.Println(“init”)
}

// 一番最初に実行
var a = func() int {
fmt.Println(“var”)
return 0
}()

// 最後に実行
func main() {
fmt.Println(“main”)
}
“`

これを実行すると、以下のようになります。

“`
var
init
main
“`

他にも、実際の実行が始まる前にプログラムの状態が正しいかどうかを検証または修復する用途にも使用される。

“`go
func init() {
if user == “” {
log.Fatal(“$USER not set”)

元記事を表示

3年の技術負債を解消するため、サービス全てをリプレイスし生産性とUXが爆上がりした話(第一弾)

## はじめに

![1716284384027 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796131/d920af3b-f194-2cb2-5316-c47057dd1d79.png)

こんにちは!
株式会社BlankrでTechLeadをしている原田です。

弊社では、『[ライドリ](https://rideo.jp)』というクリエイターの活動を支援するプラットフォームを運営しています。

2021年からライドリの前身となるサービスの運用を開始し、「オンライン握手会」「SNS」「ファンクラブ」機能など、様々な機能の追加を行ってきました。

今回は、サービス開始から3年が経過した2023年に、メンバー3名で1年かけてサービスを全てリプレイスしたことについて紹介します。

リプレイス後、チームの生産性が向上・バグの問い合わせ数が減少・ページの読み込み速度が向上するなど、様々な効果が得られました。

ぜひ最後までご覧いただけたらと思います。

## 目次

– [はじめに](#はじめに

元記事を表示

How to use Enums in Golang

## Background

Imagine you’re building a Todo application using Go. Each task in your application has a status associated with it, indicating whether it’s **“completed”**, **“archived”** or **“deleted”**.

As a developer, you want to ensure that only valid status values are accepted when creating or updating tasks via your API endpoints. Additionally, you want to provide clear error messages to users if they attempt to set an invalid status apart from the valid ones.

**_Of course, you will sa

元記事を表示

golang

golangを全く知らない状態から学習しましたので、それに自分のコメントをつけたメモです。
今回は以下の3つのUdemy講座を視聴しました。どれも分かりやすい講座でした。一部goのバージョンによってはうまくいかない講座もあるのでその場合は適宜調整が必要です。(そこまで大きな調整ではありませんので、大丈夫だと思います。)

https://www.udemy.com/course/golang_concurrency/learn/lecture/36733674?start=45#questions
https://www.udemy.com/course/go-fintech/learn/lecture/12058826?start=0#questions
https://www.udemy.com/course/bitcoin-lambda-golang/learn/lecture/24927994?start=15#questions

golang学習の定番サイトである`A Tour of Go`は今回学習せずに受講しましたが、他のプログラミング言語を触った経験のある人は一部を除

元記事を表示

OTHERカテゴリの最新記事