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

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

【個人開発】LINE Bot「あとで読むゼッタイ君」をリリースしてみた

## はじめに

この度「あとで読むゼッタイ君」というLINE Botを個人で開発し、リリースしてみました。
その機能の紹介や技術的な話、感想等をつらつらと書いていきたいと思います。

ちなみに「あとで読むゼッタイ君」は、[こちらのリンク](https://lin.ee/WvHi3bx) or 以下のQRコードから友達追加が可能なので、ぜひ使って頂けると嬉しいです!

![あとで読むゼッタイ君.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526830/49daa827-b910-b19c-392c-eea1ffb375ca.png)

## どんなアプリ?

後で読みたいなーと思ったWebページを管理(登録・閲覧・削除)できるだけの超絶シンプルなLINE Botです。
具体的には、ユーザーが送ったメッセージ内容に応じて、以下の機能が利用できます。

– URLのみを送信すると、後で読みたい記事(WebページのURL)をブックマークとして登録できる
– 「読む」というメッセージを送信すると、ブックマー

元記事を表示

【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 main

import (
“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 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

元記事を表示

OTHERカテゴリの最新記事