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

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

Go言語でHelloWorldしてみた

# goのインストール
https://go.dev/doc/install
– windowsなのでmsiインストーラを選択して、インストール
– デフォルトはC:\Program Files\Go だが、C:\Goにインストールした

## go version
– バージョンの確認
インストールされているかチェック
“`
>go version
go version go1.22.4 windows/amd64
“`
– 環境変数PATHにも追加されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546030/2e71c507-1352-6edc-1e66-507a2e64382d.png)
– パスを有効にするには、ログインしなおす

# HelloWorld
– 適当なフォルダを作成

## go mod init
– 必要なモジュールを追加
`go mod init [モジュール名]`

– example/helloをモジュールに追加
“`
>go mod in

元記事を表示

go: go.mod file not found in current directory or any parent directory; see ‘go help modules’で怒られた

go run . を実行すると以下のエラーで怒られた。

“`
go: go.mod file not found in current directory or any parent directory; see ‘go help modules’
“`

調べてみるとgo modなるものが必要だったため以下のコマンドで追加。

“`
$ go.mod hoge

$ cat go.mod
module hoge

go 1.22.3
“`

module名とgo versionが記載されたファイルが追加された。

調べてみるとgo mod ファイルは go のパッケージの依存関係を管理するファイルのようだ。

“`
$ go mod init hogehoge
go: \go.mod already exists
“`
同一ディレクトリで再度実行すると怒られるので、1ディレクトリ1ファイルしか置けないようだ。
配下の別ディレクトリでは同名のmodファイルを作成することが出来た。

[standard go project layout](https://github.c

元記事を表示

【Go】PokeAPIで学ぶGo言語 ~GoでAPIを叩く、特定のデータだけ抽出しレスポンスを返す~

# この記事の内容
* Go言語で外部APIを叩く方法
* 取得した結果から特定の項目だけ取り出し、扱う方法

Goのチュートリアル、入門書を終えたのでPokeAPIを使い手を動かしながら学ぶ記事です。

## 実現すること
PokeAPIを叩いて得たデータから種族値の値のみ抜き出してレスポンスを返す。

### PokeAPI

https://pokeapi.co/

ポケモンに関する様々なデータを取得できるAPI

### 種族値とは?

https://yakkun.com/dp/system.htm

>ポケモンの種類ごとに各『のうりょく』別に能力値の基準となる、種族値(しゅぞくち)という隠し数値を持つ

後々、努力値、レベル、個体値などからステータス算出する処理など実装しても勉強になりそうなのでやりたいと考えています。

## 実装の流れ
以下の順番で行います。
1. 新しいGoプロジェクトを作成
1. ハンドラーの作成、ルーティングの設定
1. PokeAPIを叩き、種族値をレスポンスとして返すハンドラーを実装

## 新しいGoプロジェクトを作成

Goで新しいプロジェ

元記事を表示

Go+Gin+GORM開発環境で食品管理APIを作る~クリーンアーキテクチャ編~

# はじめに
GO開発環境におけるクリーンアーキテクチャについて、実際に[こちらの記事](https://qiita.com/sedori/items/5f3c89e934ff30ad6067)で作成したAPIの構成を見直してみました。

# クリーンアーキテクチャとは

こちらに詳しい説明があります。

https://qiita.com/seiya2130/items/69801fc2637eef596137

複雑なことを言っているように見えますが、複雑です。

ざっくり、

– ソフトウェアはレイヤーに分割して責任を分界する
– ソフトウェアは抽象し、依存する
– 制御の流れと依存関係は逆転する

というポイントを抑えつつ、さっそくソースをがっつり修正していきます。

# クリーンアーキテクチャの実現

ソース修正の前に、クリーンアーキテクチャ実現に向けて依存性の注入(DI:Dependency Injection)を行うため、今回はwire(DI用のツール)を用いています。

https://github.com/google/wire

開発環境を構築する際に以下のコマンド

元記事を表示

Go+Gin+GORM開発環境で食品管理APIを作る~GitHubCopilotChat編~

# はじめに
[こちらの記事](https://qiita.com/sedori/items/5f3c89e934ff30ad6067)で作成した食品管理APIを、今度はGitHub Copilot Chatを用いて作成してみたのでその内容をまとめました。

「見せてもらおうか GitHubのCopilotの性能とやらを」という気持ちです。

# GitHub Copilotについて
GitHubが提供する、AIを使ってプログラミングを支援するサービスです。
利用には課金が必要で主要言語は英語ですが、最近では日本語対応も進んできているので、以前に比べれば使いやすく、便利になってきています。

https://docs.github.com/ja/copilot

# GitHub Copilot Chatについて
GitHub Copilotと対話して、GitHub.com およびサポートされている IDE 内でコーディング関連の質問をしたり、回答を受け取ったりできるチャットインターフェイスです。
GitHub Copilotに課金していれば追加料金なしで利用することができます。

h

元記事を表示

Go+Gin+GORM開発環境で食品管理APIを作る~データ登録・更新・削除編~

# はじめに

[こちらの記事](https://qiita.com/sedori/items/f3cd7c41b97f9202f842)に引き続き、Go開発環境で食品管理APIを作っていきます。

今回は食品の追加、更新、削除APIを作ります。

# 検証環境および開発環境

[前回記事](https://qiita.com/sedori/items/f3cd7c41b97f9202f842)を参照

# 食品の登録、更新、削除APIの作成

今回はREST APIとして作成を進めていきます。

なお、処理は前回作成した取得APIのソースに付け足していきますので、重複する部分は割愛します。

### RESTについて

**RE**presentational **S**tate **T**ransferの略です。

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

:::note info
RESTの4原則

– Stateless (状態を保持せず、各リクエストやレスポンスが完結していること)
– Uni

元記事を表示

Go言語におけるCORS設定の実装方法

Go言語でHTTPサーバを実装する際にCORS(Cross-Origin Resource Sharing)の設定を行う方法。

※CORS:ウェブアプリケーションが異なるオリジンのリソースを安全にリクエストできるようにする仕組み

### CORSミドルウェアの実装
CORSポリシーを実施するミドルウェア関数を定義。(今回は全てのHTTPレスポンスに適切なCORSヘッダーを追加し、プリフライトリクエストに適切に応答するものとして定義している)
“`go:presentation/cors_middleware.go
package presentation

import “net/http”

func CORSMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set(“Access-Control-Allow-Origin”, “*”)

元記事を表示

Go+Gin+GORM開発環境で食品管理APIを作る~データ取得編~

# はじめに

[こちらの記事](https://qiita.com/sedori/items/68608e3b57a6a0467b4f)で検証に用いた食材-食品データベースを利用して、Go開発環境で実際に食品管理APIを作ってみようと思います。

※今回は食品取得APIのみです。

# 検証環境

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

air v1.52.0

MySQL 8.0.29
“`

開発環境の参考情報はこちら

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

:::note info
Goモジュールの初期化は `go mod init go_project` としています。
※もし異なるモジュール名にした場合、以下のソースのgo_projectの部分を変更した値に書き換えてください。
:::

# ディレクトリ構成

最終的には次のようになりました。
~~(名前の突っ込みは受け付けません)~~

“`shell
.
├── .air.toml

元記事を表示

Go言語でパッケージ呼び出し

### プログラムの構成

helloパッケージ
 |_ hello.go
main.go

### helloパッケージ内の処理をmain.goで呼び出す

“`
package main

import “Fyne01/Lesson1/hello”

func main() {
hello.Hello()
}
“`
Goで宣言できるパッケージは1つだけなので、他言語のようにいくつもパッケージで呼び出すことはできない。
代わりにimportを使って呼び出す。

元記事を表示

Goでマイグレーションしようした時の構造体のタイポによるエラー

## 構造体の定義

“`go
type Shop struct {
ID uint `json:”id” gorm:”primaryKey”`
ShopName string `json:”shopname” gorm:”not null”`
Place string `json:”place”`
Location float64 `json:”location”`
Price uint `json:”price”`
Tag string `json:”tag”`
CreatedAt time.Time `json:”created_at”`
UpdatedAt time.Time `json:”updated_at”`
User User `json:”user” gorm:”foreignKey:UserID; constraint:OnDelete:CASCADE”`
UserId uint `json:”userid”`
}
“`

元記事を表示

Ginフレームワークのバインディングとバリデーションを試してみる

# はじめに

Go言語+GinフレームワークでAPIを作成するにあたり、リクエストの形式がJSONのときに構造体へのバインドとバリデーションチェックを行う仕組みを試してみます。

https://gin-gonic.com/ja/docs/examples/binding-and-validation/

# 実行条件

“`shell
Golang v1.22.3
Gin v1.10.0
air v1.52.0

“`

# ディレクトリ構成

“`shell
.
├── .air.toml
├── Dockerfile
├── docker-compose.yml
├── go.mod
├── go.sum
├── main.go
└── tmp
“`

# 検証

`main.go`の中身はこんな感じ

“`golang:main.go
package main

import (
“github.com/gin-gonic/gin”
“net/http”
)

type JsonRequest struct {
Id int `binding

元記事を表示

VSCodeでGO+air+delveのDocker環境をリモートデバッグしよう!

## 概要
VSCodeを使ってGO、air、delveのDocker環境をリモートデバッグする方法について解説します

## 前提
– WebフレームワークはGinを使用
– ORMはPrismaを使用
– GO 1.21を使用

## ディレクトリ構成
“`
tree
.
├── .env
├── .gitignore
├── Makefile
├── README.md
├── application
│ ├── .air.toml
│ ├── .vscode
│ │ └── launch.json
│ ├── config
│ ├── controllers
│ ├── go.mod
│ ├── go.sum
│ ├── main.go
│ ├── prisma
│ ├── routes
│ ├── serializers
│ └── services
├── containers
│ ├── go
│ │ ├── Dockerfile
│ │ └── Dockerfile.debug
│ └── p

元記事を表示

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

さて、今回は更新と削除のメソッドを作成していきたいと思います!
とは言っても構造体などはgetItemやputItemに似ているので非常に分かりやすかったです。

とりあえず全体像は以下の通りになります。
“`
package main

import (
“encoding/json”
“net/http”

“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”
)

var (
tableName = “MyDynamoDB”
dynamoDb = dynamodb.New(session.Must(sess

元記事を表示

Go + Reactでアプリを作成してみた【認証付Realtime Chat】

## Go Realtime Chat applicationのデータベース設定と認証エンドポイントの実装

(1) postgres image from docker hub
– create the go-chat database

(2) database setup
– make a connection to the db
– add a db migration file to create the `user` tabele

(3) /signup endpoint to create a new user
– repository ← service ← handler(dependencies)

(4) /login & /logout endpoint
– jwt with http-only cookie(prone to csrt attacks)
– vs.token-based authetication(prone to xss attacks)
– best:short-lived access token + refresh token

##

元記事を表示

GORMライブラリのアソシエーションを試してみる

# はじめに

Go言語およびGORMライブラリの初学者である私は、ドキュメントを見ても部分的な情報だけではイマイチ使い方が把握できませんでした。
ですので、実際に書いて理解した内容を備忘録として載せておきます。

今回は次のアソシエーションを試してみました。

– belongs to(多対1 または 1対1)
– has one(1対1)
– has many(1対多)
– many to many(多対多)

https://go.dev/

https://gorm.io/ja_JP/

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

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

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

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

# 検証環境

今回は実行結果をJson形式で確認したかったので、Go+Gin+GORMの構成で進めます。
開発環境の構築は以下を利用しています。

h

元記事を表示

How to do Data Serialization and Deserialization in Golang

> Exciting News! Our blog has a new **[Home!](https://canopas.com/blog)** 🚀

## Background

Background
Serialization and deserialization are essential processes in modern software development, enabling data to be efficiently transported and stored.

In Go (Golang), these processes are straightforward. Thanks to its robust standard library and the availability of third-party packages.

In this blog post, we will delve into the basics of serialization and deserialization in Go, covering popular fo

元記事を表示

Go言語での開発におけるMVCモデルについて考えてみる

# はじめに

今回はGo言語での開発におけるMVCモデルについて考えてみました。

[過去記事](https://qiita.com/sedori/items/ba7b825876d906ae2aa1)で作成したプロジェクトをMVCモデルに置き換えてみます。

### MVCとは
Model, View, Controllerの頭文字を取ってMVCです。
Modelはビジネスロジックを担当し、ViewはHTMLなどユーザーが確認できる部分を担当し、ControllerはModelとViewの橋渡しを担当します。

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

# 検証環境

構成について考えるにあたり、過去の記事をベースに進めます。

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

ただし、今回は構成を見直すにあたって必然的にソースの改修も行っているので、参考になるのはGo開発環境の構築までかもしれません。

ですので、ひとまずはGo-Gin-GORM開発環境を作

元記事を表示

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

# 前提条件

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

元記事を表示

OTHERカテゴリの最新記事