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

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

Ginを使ったWeb APIをreleaseモードで起動する方法と、環境変数の使い分け

# はじめに

Ginを使ったWeb API起動時には、基本的に以下の文が表示されます。

“`
[WARNING] Running in “debug” mode. Switch to “release” mode in production.
“`

これは開発環境なら問題ありませんが、デプロイの際にはreleaseモードとして起動する必要があるということです。

そこで、releaseモードでの起動方法と、ついでに環境変数の使い分けについて紹介しようと思います。

***バージョン一覧***
| 使用技術 | バージョン |
|:-:|:-:|
| go | 1.22.0 |
| gin | 1.9.1 |
| godotenv | 1.5.1 |

# releaseモードでの起動

これは簡単で、起動時のコマンドを以下のようにするだけです。

“`
GIN_MODE=release go run cmd/main.go
“`

このコマンドによって起動すると、起動時に
“`
[GIN-debug] GET ~
[GIN-debug] GET

元記事を表示

Go(Gin)を用いてDBサーバからデータを取得する(Herokuデプロイまで)

この記事ではGoのginフレームワークを用いてデータベースサーバーからデータを取得し,JSON形式で表示することを目標とする.今回はdockerで環境構築をする.DBMSはPostgreSQLを用いる.
>goのバージョンは`1.22`を用いる

# Dockerで環境構築
まずプロジェクトディレクトリを作成する.
“`
mkdir yourprojectname
cd yourprojectname
“`
goプロジェクトを始めるために新しいGoモジュールを初期化する
“`
go mod init example.com/yourprojectname
“`
次にginフレームワークをインストールする.
“`
go get -u github.com/gin-gonic/gin
“`

DBサーバー(PostgreSQL)からデータを取ってくるための依存関係を追加する.
“`
go get github.com/lib/pq
go get golang.org/x/net
“`
:::note info
`go get github.com/lib/pq`
Go言語で

元記事を表示

【Go】mockgenでディレクトリ内のファイルからモックを一度に作成するスクリプト

# mockgenとは?
Goでモックを作成するためのパッケージです。
※ `golang/mock/mockgen`はアーカイブされているため、使用するのは`go.uber.org/mock/mockgen`になります。

インストールは以下のコマンド
“`zsh
go install go.uber.org/mock/mockgen@latest
“`

モックを作成する際は、以下のコマンドのように一つづつ作成するが、正直めんどくさいですよね😇
“` zsh
mockgen -source=foo.go [other options]
“`

という事で、対象ディレクトリ内のファイルを全てモック化してもらいましょう😎

# ディレクトリ内のファイルから一度にモックを作成するスクリプト

“` shell
#!/bin/bash -eu
# 環境変数設定
ROOT=対象のルート
MOCK_DATA_ROOT=”モックを格納するディレクトリ”

# ROOTのモック化したいファイルのあるディレクトリ一覧
# この例では、usecaseとrepositoryディレクトリ配下のフ

元記事を表示

makeとappendの特性と理解

## 実装

“`go
s := make([]int, 5)

s = append(s, 1, 2, 3)
fmt.Println(s)

// [0 0 0 0 0 1 2 3]
“`

上記はmakeメソッドでスライスを作成しました。第一引数を省略するとlenが5のスライスが作成されます。その結果ゼロ値`[0, 0, 0, 0, 0]`となります。そこに上記のようなappendメソッドで要素を実行すると、余計なゼロ値に値が加わってしまいます。対策としては、下記のような記述になります。

“`go
s := make([]int, 0, 5)

s = append(s, 1, 2, 3)
fmt.Println(s)

// [1 2 3]
“`

上記の実装だとmakeメソッドで、len0でcap5のスライスが作成されます。その結果`[]`となります。そこに上記のようなappendメソッドで値を追加すると、余分なゼロ値を取り除いたスライスが作成できます。

## 参考記事

[Go言語のmakeについて – Qiita](https://q

元記事を表示

Goのinterfaceを覚えよう!

はじめに

初めまして。Goを始めて2か月の新人プログラマーです。
このアカウントでは、自分が詰まった箇所を後で見返せるように
メモとして残しておきます。
今回はinterface編です!

そもそものinterfaceの定義

公式情報によると、interfaceとは、「メソッドのシグネチャの集まり」と
書かれています。なんのこっちゃですよね。
要約すると、そのメソッドの集まりを実装した値を、interface型の変数へ
持たせることができるということです。

実際に使ってみた

“`Go:main.go
package main

import “fmt”

type I interface {
M()
}

type T struct {
S string
}

func (t T) M() {
fmt.Println(t.S)
}

func main() {
var i I = T{“hello”}
i.M()
}
“`

これは公式からコピペしただけのコード

元記事を表示

Golangはじめて物語(第12話: セルフマネージドなGitLabで共通モジュール運用編)

# はじめに
Golangシリーズ第12回。
以前の記事ではCodeCommitを用いたモジュール管理の方法を書いたが、今回はGitLabを使い、より実践的にモジュールを管理・運用する方法をまとめてみる。

https://qiita.com/neruneruo/items/fdbb9bbe02861223c215

前提知識としては以下の通り。
– 基本的なGitの操作ができること
– 基本的なGitLabコンソール画面の操作ができること

また、Golangのバージョンは1.21.7を用いているため、今後のバージョンアップによりコマンド等が変更になる可能性があることは留意いただきたい。

# 共通モジュールの作成
今回は“`module-group/submodule“`という名前のモジュールを作っていく。
また、GitLabは“`example.com“`というドメインで運用する前提とする。

## コードを作成する
今回のサンプルでは中身はとりあえず何でもよいので、標準出力するだけの超簡単なモジュールにする。

“`golang:submodule.go
packag

元記事を表示

Golangでコンソール表示させる方法

## 文字列を表示させたい場合
“`golang:main.go
package main

import “fmt”

func main {
fmt.Println(“Hello World!”)
}
“`
#### 注意点
Goではダブルクォート“`””“`で囲わないと文字列と判定されません。

## 変数を表示させたい場合
“`golang:main.go
package main

import “fmt”

func main {
num := 4
fmt.Println(“num”)
}
“`

## 2つ以上の変数を表示させたい場合
“`golang:main.go
package main

import “fmt”

func main {
num := 4
fmt.Println(“num=”, num)
}
“`

#### 結果
“`console
num=4
“`

#### 注意点
2つ以上の変数をつなげたい場合は “`,“` で変数をつなげます。

元記事を表示

【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 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”, “*”)

元記事を表示

OTHERカテゴリの最新記事