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

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

【すぐにテスト環境構築】超簡易なJSONファイルを使ったMockサーバーを作った

## 概要
`/responses`配下にJSONファイル(`*.json`)を置くだけで、JSONを返すMockサーバーを作成しました。(自分用)

### 対象者
小規模なアプリケーションのテストをしたい方、テスト環境構築にとにかく時間をかけたくない方

### ソースコード
“`bash
git clone https://github.com/RyutaSato/mock-api.git
“`

## 使い方
リポジトリをクローンし、以下のコマンドでDockerを起動します。

`${PORT}`はListenしたいポート番号に置き換えるか、環境変数で指定します。
“`bash
# cd mock-api
# PORT=8080
docker build -t mock-api .
docker run -d -p ${PORT}:8080 -v $(pwd)/responses:/responses mock-api
“`

Windows上でPowerShellを使用している場合
“`powershell
# cd mock-api
# $PORT=8080

元記事を表示

なんとなくDDD(ドメイン駆動設計)を用いていたらDB駆動設計になってしまった話

# はじめに

都内でエンジニアをしている者です。最近、初めてドメイン駆動設計(DDD)を用いたプロジェクトを担当しましたが、初めての挑戦だったため、結果的にDB駆動設計になってしまいました。この経験から学んだことを共有したいと思います。

# どんな失敗をしたのか

主な失敗は、ドメインオブジェクト(エンティティ)を作成する際に、データベースのテーブルモデルの構造体をそのまま流用してしまったことです。本来、テーブル構造とドメインオブジェクトは独立しており、ユースケースごとにドメインオブジェクトを設計するべきです。しかし、私はDBの構造に引っ張られて、必要以上にDBの設計に依存したオブジェクトを作ってしまいました。

# ドメインオブジェクト(エンティティ)の作成方法

どのようにモデリングすればよいのか当初は悩んでいましたが、以下の記事に出会い、非常に納得できました。

– [参考記事](https://qiita.com/MinoDriven/items/2a378a09638e234d8614)

この記事の「役割」を基にしたモデリングの考え方が非常にしっくりきました。例えば、「

元記事を表示

Go言語のSNMPパッケージgosnmpのサンプルプログラムをSNMPv3対応する方法

# はじめに

前回までの記事

https://qiita.com/twsnmp/items/2986b696cced09820291

でgosnmpパッケージのサンプルプログラムについて紹介しました。
これまでの説明は、デフォルトのSNMPv2cによる通信でした。
セキュリティーを重視する人は認証や暗号化に対応したSNMPv3で通信したいと思っているでしょう。そこで、今回は、このサンプルプログラムをSNMPv3対応にする方法を説明します。

# SNMPv3対応

SNMPv3対応に変更したソースコードは

“`diff_go
package main

import (
“fmt”
“log”

g “github.com/gosnmp/gosnmp”
mibdb “github.com/twsnmp/go-mibdb”
)

func main() {
m, err := mibdb.NewMIBDB(“./mib.txt”)
if err != nil {
fmt.Printf(“NewMIBDB failed err=%v”, err)
return

元記事を表示

GoでURLからクエリパラメータを取得する方法

GoでURLからクエリパラメータの値を取得する方法について、取り上げます!

http://localhost:8080/todos?size=3&prev_id=2
このようなURLからsizeとprev_idを取り出していく方法を見ていきましょう〜

### 全体のコード
“`
func (h *TODOHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if r.Method == “GET” {
myUrl, _ := url.Parse(r.URL.String())
log.Println(myUrl)

params, _ := url.ParseQuery(myUrl.RawQuery)
log.Println(params)

size, err := strconv.ParseInt(params.Get(“size”), 10, 64)
if err != nil {
http.Error(w, “invalid size parameter”,

元記事を表示

Go言語でPostgreSQLを使ったデータベースのリセット方法

# 本記事の内容
Go言語を使って数値計算シミュレーションアプリのバックエンドを開発しています。計算に使用する数値データを保存するためにデータベースを活用しており、開発中にはテストや新しいデータを作成する際にデータベースをリセットする必要が頻繁に発生します。もちろん、特定の部分だけを更新することも可能ですが、データ構造自体も試行錯誤しながら進めているため、既存のテーブルや登録データを削除してデータベースをクリーンに保つ方が、開発の効率化につながります。

この記事では、既存のテーブルを削除して再作成する具体的な方法について解説します。

※本記事はあくまで個人開発の一環であり、PostgreSQLやデータベース管理に関して誤りがあればぜひご指摘いただけると幸いです。

# 使用環境

* Windows11 pro
* PostgresSQL
* Go言語
* pgAdmin4

# Postgresデータベースのリセット方法
PostgreSQLでデータベースをリセットする際には、主に以下のステップを踏みます。

1. **スキーマの削除**: テーブル、ビュー、シーケンスなどすべて

元記事を表示

Goで利用するORM・SQLライブラリ比較とsqlcの魅力

# はじめに

 こんにちは!今回はGoのSQLライブラリ「sqlc」についての記事を書こうと思います。

 (記事作成の動機の話 … )この夏参加した2週間のインターンで、チーム開発に挑戦しました(後日記事を書きます)。その際、データベースとのやり取りを効率化するために、チームで採用したのが 「sqlc」 です。チームでは sqlc を使って、手書きのSQLを活かしながら型安全なGoコードを自動生成し、機能実装を進めました。(冒頭から若干のネタバレ)

 実際に使用してみて感じたのは、その快適さ。**SQLの柔軟性を保ちながら、型安全なコードが生成される**という点で、個人的にも「これは今後のプロジェクトでもぜひ使いたい!」と思いました。
 とはいえ、ORM/SQLだけでも世の中にはいろんな種類のライブラリが存在しており、エンジニアはこれを適切に選定しなくてはなりません(ということをインターンで学びました)。そこで、今回は他のORM/SQLライブラリについても触れ、比較を行っていきたいと思います。(内容に誤りがあればご指摘ください🙇)

 本編では、私自身が経験した sqlc

元記事を表示

Go言語のSNMPパッケージgosnmpを人にやさしくする方法

# はじめに

前回、Go言語のSNMPパッケージgosnmpを紹介しました。

https://qiita.com/twsnmp/items/45a02243ce3fbca2a55f

このパッケージの利用を、少し人に、やさしくする方法の説明です。

# gosnmpの不便なところ

前回の記事で紹介したサンプルソースコードと実行結果では、MIBの名前を数値のOIDで指定しています。

“`go:main.go
oids := []string{“1.3.6.1.2.1.1.4.0”, “1.3.6.1.2.1.1.7.0”}
result, err2 := g.Default.Get(oids) // Get() accepts up to g.MAX_OIDS
“`

“`:実行結果
$go run main.go
0: oid: .1.3.6.1.2.1.1.4.0 string: twsnmp@gmail.com
1: oid: .1.3.6.1.2.1.1.7.0 number: 72
“`
です。

数値のOIDは、人に、やさしくありません。いったい何の

元記事を表示

Go言語のSNMPパッケージgosnmpのサンプルプログラムを試す方法

# はじめに

SNMPに関連したプログラムは、ほとんどの場合NET-SNMPを利用して開発していると思います。C言語の他に、PerlやPyhtonからも利用できますが、Go言語からは簡単に利用できません。

そこで、今回はピュアGoで書かれたSNMPクライアントライブラリgosnmp

https://github.com/gosnmp/gosnmp

を紹介します。基本のサンプルプログラムを試す方法の説明です。

# 準備

“`shell
mkdir snnmp_get
cd snmp_get
go mod init snmp_get
go get github.com/gosnmp/gosnmp
“`

で準備完了

# サンプルログラム

GitHubのサイトにあるサンプルプログラムは、

“`go

package main

import (
“fmt”
“log”

g “github.com/gosnmp/gosnmp”
)

func main() {
// Default is a pointer to a GoSNMP struct that

元記事を表示

【Go言語】 スライス

# 前回までのあらすじ
第3回目は「型アサーション」について学びました。もしよかったらご覧ください。

https://qiita.com/koutorino/items/b1e335bc30618f5470be

今回も引き続きUdemyの『【Go入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)』の内容をもとに学習を進めていきます。

https://www.udemy.com/course/golang-webgosql/?couponCode=ST11MT91624B

# スライスとは
配列とはちょっと違ったものがスライスです。配列よりも使い勝手が良いので、Go言語ではよくみられるものになっています。これから細かくみていきます。配列と違って`[]`内に数値を入れなければスライスになります。

“`golang
//明示的
var sl []int = []int{100, 200}
// [100 200]

//暗黙的
sl := []int{100, 200}
// [100 200]

//make関数
sl :

元記事を表示

Go:エラーの出力と処理の基本

# はじめに
こんにちは!株式会社HRBrainの25卒インターン生のizutakuです!
Goで個人開発を行っていた際、エラーハンドリングに一貫性が無いことに気づいたため、改めてエラーハンドリングの基礎を学びました。
この記事では主に以下のパッケージを使用したエラーハンドリングとカスタムエラーについて紹介しますので、ご興味があれば一読ください!

– errors
– fmt
– log
– os

# errors
シンプルなエラーメッセージを持つオブジェクトを生成する。
“`golang:main.go
package main

import (
“errors”
“fmt”
)

func divide(a, b int) (int, error) {
err := errors.New(“cannot divide by zero”) //エラーメッセージを持つオブジェクトを作成

if b == 0 {
return 0, err
}

result := a / b
return result, nil
}

func main() {

re

元記事を表示

Go言語とC++で演算子の優先度が違ってバグった話

# GoからC++への移植
最近、C++の練習がてらAtCoderなどの競技プログラムをC++でもやり始めました。基本Go言語でやっているので、Go言語でプログラミングしてACしたあとに、C++に移植というスタイルでやっています。

Go言語からC++にポーティングする時に、演算子の優先度でバグったので情報共有しておきます。

# バグったコード

具体的には、以下の式です

“`go
bit = x >> i % 2
“`

この結果がC++とGoで異なり、どこでミスが発生しているのかを見つけるのにえらく苦労しました(まさか、ここの挙動が違うとは思いもしませんでした)。

# 実際に確認してみる

## Go言語

“`go
package main

import “fmt”

func main() {
x := 0x55

for i := 0; i < 8; i++ { fmt.Println(i, x>>i%2, (x>>i)%2, x>>(i%2))
}
}
“`

上記のプログラムの実行結果は、以下になります
“`text
0 1 1 85
1 0

元記事を表示

GO言語でpingを実行するプログラムの作り方

# はじめに

GO言語で開発するプログラムの中でpingを実行して疎通確認をしたい場合があると思います。そのためのパッケージの紹介です。

https://github.com/prometheus-community/pro-bing

を使います。go-pingというパッケージがありますが、今はメンテナンスされていません。検索して見つかっても使わないほうがよいです。

# PINGを実行するプログラム

“www.google.com”へpingするプログラムは

“`go
package main

import (
“log”

probing “github.com/prometheus-community/pro-bing”
)

func main() {
pinger, err := probing.NewPinger(“www.google.com”)
if err != nil {
log.Fatalln(err)
}
pinger.Count = 3
// pinger.SetPrivileged(true) // for Windo

元記事を表示

【Go言語】 型アサーション

# 前回までのあらすじ
第2回目は「クロージャー」について学びました。もしよかったらご覧ください。

https://qiita.com/koutorino/items/42fbec48b8f39ecee017

今回も引き続きUdemyの『【Go入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)』の内容をもとに学習を進めていきます。

https://www.udemy.com/course/golang-webgosql/?couponCode=ST11MT91624B

# 型アサーションとは
インターフェース型の変数が具体的な型に保持している値を取得するための機能のことです。
インターフェース型は異なる型の値を扱うことができるため、なんの型が入っているかがわかりにくくなります。そこで、型アサーションを使うとインターフェースの内部にある具体的な値の型を確認・取得できます。
“`golang
value := x.(T)

x: インターフェース型の変数
T: 具体的な型(例えば、intやstringなど)
“`

上記が

元記事を表示

個人的に感じたMVCアーキテクチャとレイヤードアーキテクチャの違いについて

## はじめに
初めまして。私は新卒2年目のエンジニアで、これまでに2つのプロジェクトに携わりました。1つ目のプロジェクトはMVCアーキテクチャを採用し、2つ目はドメイン駆動設計(DDD)とレイヤードアーキテクチャに基づいて開発を行いました。

この記事では、これら2つのアーキテクチャの比較を、私自身の経験を基に説明します。まだ経験が浅い部分もありますが、意見やフィードバックをいただけると嬉しいです。

## それぞれのメリット、デメリットについて
| | 学習コスト | 開発スピード | 責務の分離 |
| ———————— | ———- | ——————– | ———————————— |
| MVC | 比較的低い | 小〜中規模だと早い | チームで決めておかないと不明瞭になる |
| レイヤー

元記事を表示

【Go言語】 クロージャー

# 前回までのあらすじ
第1回目は「型ごとの特徴」について学びました。もしよかったらご覧ください。

https://qiita.com/koutorino/items/84b4895ff35f86d1d2f4

今回も引き続きUdemyの『【Go入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)』の内容をもとに学習を進めていきます。

https://www.udemy.com/course/golang-webgosql/?couponCode=ST11MT91624B

# クロージャーとは
wikiでクロージャーを調べると以下のような説明がありました。

>関数閉包はプログラミング言語における関数オブジェクトの一種。いくつかの言語ではラムダ式や無名関数にて利用>可能な機能・概念である。引数以外の変数を実行時の環境ではなく、自身が定義された環境(静的スコープ)において>解決することを特徴とする。関数とそれを評価する環境のペアであるともいえる。

ちょっと何を言っているのかわからないですが、簡単にいうと関数の外で定義された変

元記事を表示

【GO言語】 型ごとの特徴

# Go言語を学ぶ。
業務でGo言語が必要になってきたので、Go言語のアウトプットをこれからしていこうと思います。
超絶基礎的なところから始めて、アウトプットが必要だと感じた項目について記事にしていきます。
今回Udemyの『【Go入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)』の内容をもとに学習を進めていきます。
少しお金がかかりますが、私が書いていることよりも詳しく説明されていますので、ぜひこちら購入して学習してみてください。

https://www.udemy.com/course/golang-webgosql/?couponCode=ST11MT91624B

# 型ごとの特徴
型ごとに細かな特徴があるので特徴をまとめました。

## int型
– 表現方法
“`golang
//明示的
var i int = 100

//暗黙的
i := 100
“`

### int型の種類

| 型 | サイズ | 範囲 |
|–

元記事を表示

【GORM】Modelメソッドにはポインタ型の構造体を渡そう

一般的にCRUDする分には、Modelメソッドに値型の構造体を渡しても動作はします。
“`go
if err := db.Debug().
Model(User{}).
Where(“id = ?”, 1).
Updates(User{Age: 30}).Error; err != nil {
fmt.Println(“error:”, err)
}
“`
## 発生するエラー
しかし、Hooksを設定している状態で、Modelメソッドに値型の構造体を渡すと、以下のようなエラーが出力されます。
“`
invalid value, should be pointer to struct or slice
“`

## Hooksとは
特定のテーブルに対して作成、取得、更新、削除の操作を行う前後に自動的に呼び出される関数のことです。
参考: https://gorm.io/ja_JP/docs/hooks.html

## エラーが発生するコード例
“`go
func dbInit() *gorm.DB {
dsn := “root:@tcp(127.

元記事を表示

GO言語のgo-echartsパッケージを使って横棒グラフを出力する方法

# はじめに

go-echarts

https://github.com/go-echarts/go-echarts

を使ってチャートを出力するシリーズの3つ目の記事です。

1つ目は、

https://qiita.com/twsnmp/items/c0bb1b6b8dd18132dfb6

です。

今回は、横棒グラフの出力方法です。

go-echartsのGitHubにあるサンプルプログラムを、そのまま実行すると縦棒グラフ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3874862/56afe1c8-e94b-ed4d-9f37-d95c87e78bd9.png)

が表示されます。

これを1行追加するだけで、横棒グラフにできるという、お話です。

# 横棒グラフの出力

横棒グラフは、

“`go
package main

import (
“math/rand”
“os”

“github.com/go-echarts/go-echarts/v2/c

元記事を表示

Firebase Authentication でユーザー認証 & バックエンドにもユーザー登録(統合)

## はじめに
こんにちは!今回は、Webアプリケーションにおけるユーザー認証について、私が取り組んだ「Firebase Authentication」の実装方法を共有したいと思います。

Firebase Authenticationは、手軽に導入できる認証サービスとして多くの開発者に利用されています。特に、バックエンドと連携してデータベースにユーザー情報を登録・管理できる点が便利です。

この記事では、以下の内容をカバーします。

– Firebase Authenticationの概要
– Firebaseによる認証の実装方法
– FirebaseUIDを使用したバックエンドとの統合

ぜひ、実際のプロジェクトに役立ててください。

基本的な説明は[公式ドキュメント](https://firebase.google.com/docs/auth?hl=ja)に任せます。この記事では、バックエンドとの統合のための実装がメインですので、Firebase Authenticationへの登録方法等はリンクをご覧ください。🙇

## 目次
– [Firebase Authenticatio

元記事を表示

UUIDとは?GoでUUIDを生成する

## UUIDとは?
UUIDとはUniversally Unique Identifierの略で、**一意に情報を識別するための識別子**です。

フォーマットも定められています。
– 16進数形式: 32桁の16進数(数字とアルファベット)
– ハイフンで区切られた形式: 8桁-4桁-4桁-4桁-12桁、合計で36文字(32桁の16進数と4つのハイフン)

例)123e4567-e89b-12d3-a456-426614174000

以上を満たすような文字列をUUIDとし、**事実上世界中で重複しない**ためユニークなIDとして扱うことができます。

UUIDとUIDの違いは、**グローバルで一意であるのがUUID、特定のシステムで一意であるのがUID**です。

## バージョンとは?
UUIDには、**生成方法が異なる複数のバージョン**があり、**v1からv8**まで存在します。その中でも、おそらく一番多く使われているのはv4です。v4はランダムなUUIDを生成したい場合に一般的に利用されます。**用途に応じて適切なバージョンを選定することが望ましい**ですが、本記事では各

元記事を表示

OTHERカテゴリの最新記事