- 1. 【Go】PokeAPIで学ぶGo言語 ~画像データをJSONに含めレスポンスを返す~
- 2. 【Golang】Functional Option Patternで実現する関数のデフォルト引数(オプション引数)の設定方法
- 3. 【Go】PokeAPIで学ぶGo言語 ~クエリパラメータから値を取得し、ステータスを計算~
- 4. goのlinterについて調べた
- 5. Go+Gin+GORM開発環境で食品管理APIを作る~単体テスト編~
- 6. GoでOCR試してみた
- 7. Go言語でHelloWorldしてみた
- 8. go: go.mod file not found in current directory or any parent directory; see ‘go help modules’で怒られた
- 9. 【Go】PokeAPIで学ぶGo言語 ~GoでAPIを叩く、特定のデータだけ抽出しレスポンスを返す~
- 10. Go+Gin+GORM開発環境で食品管理APIを作る~クリーンアーキテクチャ編~
- 11. Go+Gin+GORM開発環境で食品管理APIを作る~GitHubCopilotChat編~
- 12. Go+Gin+GORM開発環境で食品管理APIを作る~データ登録・更新・削除編~
- 13. Go言語におけるCORS設定の実装方法
- 14. Go+Gin+GORM開発環境で食品管理APIを作る~データ取得編~
- 15. Go言語でパッケージ呼び出し
- 16. Goでマイグレーションしようした時の構造体のタイポによるエラー
- 17. Ginフレームワークのバインディングとバリデーションを試してみる
- 18. VSCodeでGO+air+delveのDocker環境をリモートデバッグしよう!
- 19. CDK×Lambda×golang×Dynamoでアプリを作ってみる DynamoDB処理のLambda実装編PUT&DELETE(第五回)
- 20. Go + Reactでアプリを作成してみた【認証付Realtime Chat】
【Go】PokeAPIで学ぶGo言語 ~画像データをJSONに含めレスポンスを返す~
# この記事の内容
* 外部APIから画像データを取得する
* 画像データをJSONに含めレスポンスを返す# ポケモンの画像取得のエンドポイント
様々な世代、種類の画像がありますが今回は「from-default」という一般的なエンドポイントを使います。
エンドポイント
“`
https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/{ポケモンのID}.png
“`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301763/6dc97883-e91e-b231-f3a9-5c8ab8025340.png)叩くとこんな感じでpngで画像が返されます。
これを前回作成した、計算後のステータス等と一緒にJSONで返したいわけです。
# 画像の取得
まずは普通にAPIを叩いて画像データを取得します。
“`go
//ポケモンの画像を取得
resImg, err := http.Ge
【Golang】Functional Option Patternで実現する関数のデフォルト引数(オプション引数)の設定方法
# はじめに
* Golangには、関数のデフォルト引数(後述します)がありません
* これに対するアプローチの1つとして「Functional Option Pattern」があります
* 本記事ではこの手法について説明します# 対象読者
* 現在Golangを学ばれている方
* これからGolangを学ばれる方# 関数のデフォルト引数とは?
説明のし易さのため、関数のデフォルト引数があるTypeScriptで説明させてください(TypeScriptが分からない方でも雰囲気は伝わるはずです)。以下はオブジェクト「Greet」を生成し、そのプロパティ「str1」と「str2」を出力するサンプルのソースコードです。
“`sample.ts
class Greet {
str1: string;
str2: string;// コンストラクタ
constructor(str1: string, str2: string = “”) {
this.str1 = str1;
this.str2 = str2;
【Go】PokeAPIで学ぶGo言語 ~クエリパラメータから値を取得し、ステータスを計算~
# この記事の内容
* GoのAPI実装でクエリパラメータを扱う方法前回の記事はこちら
https://qiita.com/rikuya98/items/a67aa61ce7bb463b4b4b
この続きでやっていきたいと思います。
# 実装すること
* クエリパラメータでポケモンのレベル、努力値、個体値を受け取る
* 受け取ったクエリパラメータからステータスを計算し、レスポンスを返す# 実装の流れ
* クエリパラメータの取得
* 受け取ったパラメータでステータスを計算
* 計算後のステータスをレスポンスに含め返す# クエリパラメータの取得
**クエリパラメータとは?**
>URIの一部で、Webサーバーに特定のデータを渡すために使用される。
URLのパスの後に「?」記号に続いて配置され、キーと値のペアで構成される。各ペアは&記号で区切られる。
以下のようなものです。
“`
https://example.com/hoge?name=hoge&age=99
“`
?の後に続く
name がキーで=の後のhogeが値になります。
上記の例では
キー:name 値:
goのlinterについて調べた
#### go vet
goのデフォルトlinter“`
$ go vet {file_name}
$ go vet {package name}
“`#### golangci-int
vs code への設定方法プロジェクト配下に設定ファイルを保存
.vscode/settings.json
“`
{
“go.lintOnSave”:”workspace”,
“go.lintTool”:”golangci-lint”,
“go.lintFlags”:[
“–fast”
]
}
“`vscodeのコマンドパレットで以下を入力
“`
GO:Install/Update Tools
“`
すべてチェックしてインストールvscodeで保存するたびにlinterが走るようになった。
Go+Gin+GORM開発環境で食品管理APIを作る~単体テスト編~
# はじめに
[こちらの記事](https://qiita.com/sedori/items/ce31e841ba904dbc2700)でクリーンアーキテクチャを意識した構成に変更した食品管理APIで単体試験(Unit Test)を実装するための手法をまとめました。# 単体試験とは
コードの最小機能ユニットをテストするプロセスのことです。
https://aws.amazon.com/jp/what-is/unit-testing/
[前回記事](https://qiita.com/sedori/items/ce31e841ba904dbc2700)の最後にも書きましたが、このシステムでいえば`func`単位で行う試験ということになりますね。
ただし、クリーンアーキテクチャに対応する前のソースコードに対して単体試験を行おうとした場合、試験対象とする処理の中で呼び出される処理まで実行されてしまうため、イマイチという話でした。
:::note info
クリーンアーキテクチャにおける試験は、抽象(インターフェイス)を参照(依存)するため、実装を簡単に差し替えられることができ
GoでOCR試してみた
ひょんなことからOCRについて気になったので簡易的なものを実装してみた。
オープンソースのtesseractというOCRエンジンがあり、今回はgo向けのラッパーgosseractを利用させてもらいました。
[otiai10/gosseract](https://github.com/otiai10/gosseract “gosseract”)# 構成
* go
* echo
* react
* typescript
* docker
* tesseract
* gosseract# Go
“`go:main.go
package mainimport (
“fmt”
“io”
“net/http”
“os”
“strings”“github.com/labstack/echo”
“github.com/labstack/echo/middleware”
“github.com/otiai10/gosseract/v2”
)func main() {
e := echo.New()
e.Use(middleware.CORSWithConfig(
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 hogego 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 presentationimport “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.10air 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 mainimport “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 mainimport (
“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 mainimport (
“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##