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

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

GOでAPI作成.PostgreSQL+GIN

# go初期設定
go言語のインストールはこちらから

インストール出来たら.
“`
mkdir myproject
“`
“`
cd myproject
“`
“`
go mod init example.com/myproject
“`
“`
go get -u github.com/gin-gonic/gin
“`
“`
go get -u github.com/joho/godotenv
“`
“`
go get -u github.com/jackc/pgx/v4
“`
# ファイル構造
“`
C:.
│ .env
│ go.mod
│ go.sum
│ main.go

├─config
│ config.go

├─controllers
│ user_controller.go

├─database
│ database.go

├─models
│ user.go

├─repositories
│ user_

元記事を表示

GOをHerokuにデプロイする際の「Permission denied」

# エラー内容

### エラーコード
“`
C:\Users\myname\GitHub\study_go>heroku restart –app go-api
Restarting dynos on ⬢ go-api… done

C:\Users\myname\GitHub\study_go>heroku logs –tail
2024-06-10T17:43:11.476157+00:00 app[web.1]: /bin/bash: line 1: ./starter: Permission denied
2024-06-10T17:43:11.523112+00:00 heroku[web.1]: Process exited with status 126
2024-06-10T17:43:11.546061+00:00 heroku[web.1]: State changed from starting to crashed
2024-06-10T17:43:11.548837+00:00 heroku[web.1]: State chan

元記事を表示

【Go】gorm × Atlasで始めるマイグレーションのバージョン管理

# はじめに
こんにちは、H×Hのセンリツ大好きエンジニアです。(同担OKです😉)

今回はGoのマイグレーションツール**Atlas**の始め方について記事を書きました!
(記事キャンペーンに投稿してQiitaオリジナルグッズが欲しいのは内緒🤫)

背景として、gormをORMに使用していたのですが、マイグレーションをバージョン管理したいな。。。という願望がありましたのでAtlasを始めました!

# Atlasとは?
公式サイト:[atlas](https://atlasgo.io/)

Atlasは、データベースのマイグレーションツールになります。
バージョンマイグレーションと、宣言的マイグレーションの2通りが使用できる&多機能になっているのでかなりオススメです!

– バージョンマイグレーション:マイグレーションをバージョン管理する
– 宣言的マイグレーション:現状のスキーマファイルとDBを比較して内部的に変更を検知した上でマイグレーションが実行される

様々な言語のORMに対応していますが、今回はgormでバージョンマイグレーションを行います。
また、MySQLを始めとした様

元記事を表示

DockerでGo言語の開発環境構築

# はじめに
現在python、djangoでのwebアプリ開発をしているのですが
ちょっとした気分転換に前から興味があったdocker、goについて
環境構築をしていこうと思います。

# 1.Windows+WSL2上でDockerを使えるようにする手順
## WSLとは
WSLとは「Windows Subsystem for Linux」の略で、言葉の通りwindowsのサブシステムとしてlinuxを使用できるようにするためのシステムです。
WSLをインストールすることでWindows上でLinuxを利用できるようになります。

## Dockerとは
1つのサーバで複数のアプリケーションを仮想化できるプラットフォームです。
簡単に言えばコンテナごとに環境がつくれて、その環境を他の人と共有することができるサービスです。
コンテナとは部屋のようなもので、部屋ごとにjavaやらpythonやらの環境をつくりその部屋をルームシェアできるよということです。一人ずつ環境をつくるとうまく動かない場合があるので、環境を共有できると便利だよねって感じ。

## 構築手順
構築手順は以下の記事を参

元記事を表示

Jupyterカーネル自作入門

この記事は2022年9月10日から開催された技術書典13にて頒布した「KLabTechBook Vol.10」に掲載したものです。

https://makiuchi-d.github.io/2024/06/04/klabtechbook10-jupyter-kernel.ja.html

元記事を表示

オンライン対戦を支える独自シリアライズフォーマット

この記事は2022年1月22日から開催された技術書典12にて頒布した「KLabTechBook Vol.9」に掲載したものです。

https://makiuchi-d.github.io/2024/06/02/klabtechbook9-wsnet2-serializer.ja.html

元記事を表示

【Go】PokeAPIで学ぶGo言語 ~ゴルーチンで並行処理を実装、ベンチマークテストで比較~

# この記事の内容
* 3つのエンドポイントからそれぞれポケモンの日本語名取得、画像取得、データ取得している処理をゴルーチンで並行処理で行うようにする
* Goの標準のテストパッケージのベンチマークテストを行い、並行処理実装前と比較を行う

## 並行処理を行う前のソースコード
“`handler.go
// GetPokeDataHandler ポケモンのデータを取得する。
func GetPokeDataHandler(w http.ResponseWriter, req *http.Request) {
var err error
var pokeParams models.PokeParams
var pokeData models.PokeData

//クエリパラメータからレベル、努力値、個体値を取得
query := req.URL.Query()
keys := []string{“lv”, “ef”, “in”}
pokeParams, err = GetQueryParams(query, keys)
if err != nil {
http

元記事を表示

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(

元記事を表示

OTHERカテゴリの最新記事