Go関連のことを調べてみた2023年08月04日

Go関連のことを調べてみた2023年08月04日

自分のおすすめの曲を紹介したい!!曲の紹介ができるアプリを作成しました。

# はじめに

はじめまして:raised_hands:
今回、曲を選曲できるアプリ「曲選曲」を制作しました!

曲を自由に選んで、投稿することができます。曲の幅を広げたい。未知なる曲を紹介されたい。みんなが気づいていない曲を紹介したい。そんな人におすすめです!

![スクリーンショット 2023-07-01 122721](https://github.com/ari5008/dev_frontend/assets/127650560/0b69d525-a62e-453d-97cf-1f8685f032f8)

## 作成した人
私は、現在大学4年生です。大学は文系でプログラミングに全く興味がありませんでした。
プログラミングに興味を持ったきっかけは、テレビ番組でプログラミングが特集され、パソコン一台でアプリが制作できるという点に強く関心を抱いたことです。その後すぐにprogateからはじめたのですが、これは面白いと思い、独学で学習を続けてきました。現在までphp、go、reactと順に触ってきました。今では個人制作でアプリまで作れるようになったので、ぜひ見ていってほしいです!

元記事を表示

Go言語で依存性逆転の原則(DIP)と依存性注入(DI)のコード例を書いてみた

## 依存性逆転の原則(DIP)と依存性注入(DI)の活用
プログラミングにおいて、依存性逆転の原則(Dependency Inversion Principle, DIP)と依存性注 (Dependency Injection, DI)は、コードの保守性や拡張性を高めるために活用される原則です。ここではDIPとDIを使用して、クラス間の依存関係をより柔軟に管理する方法について説明します。

## シンプルなシナリオ
まずは、シンプルなシナリオを考えてみます。二つの異なるパッケージ(PackageAとPackageB)があり、それぞれにいくつかのクラスが存在しています。PackageAのクラスはPackageBのクラスに依存しているという状況を考えてみます。

具体的には、PackageAのStructAがPackageBのStructBに依存しているとしましょう。この依存関係を依存性逆転の原則を用いて解決し、依存性注入によって柔軟な設計を実現します。

“`Go
package PackageA

import “PackageB” // PackageBに依存している

// P

元記事を表示

Go言語向けNCMB SDKの使い方(データストアの保存)

NCMBはモバイル向けのBaaS(mobile Backend as a Service)ですが、サーバー側のデータとNCMB上のデータを連係させたいというニーズは良くあります。

そんなときには各言語向けのSDKがあると便利です。サーバー向けにはRuby、Python、PHP、Java、C#のSDKがあります(すべて公式サポート対象外の、コミュニティSDKという位置づけです)。

今回はGo言語向けのSDK開発をはじめたので、その使い方を紹介します。まずはデータストアへのデータ保存についてです。

## ソースコード

ソースコードはGitHubにて公開しています。ライセンスはMIT Licenseになります。

[NCMBMania/ncmb\_go](https://github.com/NCMBMania/ncmb_go)

## インストール

SDKのインストールは下記コマンドで行います。

“`bash
go get -u github.com/NCMBMania/ncmb_go
“`

## インポート

続けてSDKをインポートします。

“`go
import

元記事を表示

Go言語で昔懐かしのPongを作ってみた話 – ゴール判定と得点表示の追加

前回の記事では、Go言語とEbitenを使ってシンプルなPongゲームの作成について記載しました。
今回はそのコードにゴール判定と得点表示を追加したので記載します。

## 使用するバージョン
– Go言語: 1.16
– Ebiten: v2

## 変更したコードの解説

以下に、変更を加えたコードを示します。各部分の詳細は後ほど説明します。

### Game構造体の定義
Game構造体にプレイヤーのスコアを保持する新しいフィールドを追加しました。

“`go
type Game struct {
ballPositionX, ballPositionY float64 // ボールの位置
ballDX, ballDY float64 // ボールの移動速度
paddle1Y, paddle2Y float64 // パドルの位置
player1Score, player2Score int // プレイヤーのスコア
}
“`

### Updateメソッド
ゴール判定を追加し、ボールが左右の壁に当たったとき

元記事を表示

【Go】ログイン機能でウェブアプリを作ってみる(7)

こんにちは。

Part 7は本登録 /auth/register/completeについてです。

# 今回の目標
– 本登録を実装する!

では、仮登録時と同じようにざっと確認していきましょう。

# 全体の流れの確認

– 仮登録 /auth/register/initial
– クライアントからemail, passwordを受け取る
– email宛に本人確認トークンを送信する
– 本登録 /auth/register/complete
– クライアントからemailと本人確認トークンを受け取る
– ユーザーの本登録を行う
– ログイン /auth/login
– クライアントからemail, passwordを受け取る
– 認証トークンとしてJWTを返す
– ユーザー情報の取得 /restricted/user/me
– クライアントからJWTを受け取る
– ユーザー情報を返す

では、本登録にはどんな機能が必要になるでしょうか。

# 必要な機能を考えよう!

– emailとトークンを受け取り、バリデーショ

元記事を表示

dindでsqlc+dockertest

この抜粋の内容は次のとおりです。

– 環境構築
– sqlc
– dockertest
– go test

“`mermaid
flowchart LR
VSCode
dind[“dind
postgres”]
devcontainer[“devcontainer
Go”]
VSCode –>|go test| devcontainer –>|query| dind
“`

さらに詳しく知りたい方は読み続けてください。

2023年8月1回目です。

[sqlc](https://github.com/sqlc-dev/sqlc) + [dockertest](https://github.com/ory/dockertest) についてです。

日々、database に悩まされます。例えば、query の tuning など。

また、developer が好む ORM は、query が隠蔽されるため、どんな query なのか、認識するのに時間が必要な場合が多いです。

slow query の場合、どんな

元記事を表示

Go言語で昔懐かしのPongを作ってみた話

## はじめに
前回は画面上でボールが動くだけの処理について記載しましたが、
ボールが動くのであれば、昔懐かしのpongのようなホッケーゲームができると思い作成しました。
以下はソースについて記載します。

## 必要なパッケージのインポート

“`go
import (
“image/color” // 色を扱うためのパッケージ
“log” // ロギングを行うためのパッケージ

“github.com/hajimehoshi/ebiten/v2” // Ebitenのパッケージ
“github.com/hajimehoshi/ebiten/v2/ebitenutil” // Ebitenのユーティリティパッケージ
)
“`

## 定数の定義

“`go
const (
screenWidth, screenHeight = 640, 480 // 画面の幅と高さ
paddleWidth, paddleHeight = 20, 80 // パドルの幅と高さ
ballSize = 20 // ボールの大きさ
pad

元記事を表示

aws-sdk-go Dynamodb PutItem Err: ValidationException について

# はじめに
初投稿になるので何か指摘等あればよろしくお願いします。

# このエラーについて (ValidationException)
Local環境でsamを利用してAPI経由でLambdaからDockerで建てたLocalのDynamodbにアクセスしている状況です。
Tableはaws-cliで作成し、lambdaからPutItemした時に起きたエラーです。

[AWSの公式](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Programming.Errors.html)によると、
> このエラーは、必須パラメータが指定されていない、値が範囲外である、データ型が一致しない、などいくつかの理由で発生します。エラーメッセージに、エラーを引き起こしたリクエストの特定部分に関する詳細が含まれています。

# 結論
Goの構造体の値がエクスポートされておらず、定義されていない状態でした。
なのでデータ型が一致せずにエラーが出たということです。

Dynamodbの項目が小文字から始まる場合、

元記事を表示

【Golang】 基礎

## 変数の省略定義
“`golang:
// 型は自動で推測される
name := “John”

// 以下と同じ
var name string
name = “John”
“`

## 名前付き戻り値
戻り値を変数として定義しておくことで、return のみで返却できる
“`go:
func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum – x
return
}

func main() {
a, b := swap(10, 7)
fmt.Println(a, b)
}
“`

## Defer
defer へ渡した関数の実行を、呼び出し元の関数の終わり(returnする)まで遅延させる。
defer へ渡した関数が複数ある場合、その呼び出しはスタック( stack )されます。 呼び出し元の関数がreturnするとき、 defer へ渡した関数は LIFO(last-in-first-out) の順番で実行されます。

“`go:
fu

元記事を表示

【Go】POSTのAPI作成

# 作るもの
– NameとEmailをPOSTで送り、それに基づくレスポンスを返すようなAPI(Go言語)。
– POST以外のメソッドは受け付けないようにする。

![スクリーンショット 2023-08-01 16.51.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1850625/7892ba22-966a-0c1f-dfe3-39b947535344.png)

![スクリーンショット 2023-08-01 16.51.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1850625/989eedeb-d34e-366a-61d3-b035247d2b1f.png)

# 実装
“`go:main.go
package main

import (
“encoding/json”
“fmt”
“log”
“net/http”
)

// RequestBody はPOSTリクエストのJSONデー

元記事を表示

Ebitenを使ってボールをランダムに動かすゲームを作成する

EbitenというGo言語で開発された2Dゲームエンジンを使って、ボールがランダムに動き回るシンプルなゲームを作成する方法を記載します。

“`go
package main

import (
“image/color” // 色を操作するためのパッケージ
“log” // ログ出力を扱うためのパッケージ
“math/rand” // 乱数を生成するためのパッケージ
“time” // 時間に関する操作を扱うためのパッケージ

“github.com/hajimehoshi/ebiten/v2” // Ebitenのゲームエンジンのパッケージ
“github.com/hajimehoshi/ebiten/v2/ebitenutil” // Ebitenのユーティリティパッケージ
)
“`

次に、ゲーム画面のサイズとボールの大きさを定数で定義します。

“`go
// 画面のサイズとボールの大きさを定義
const (
screenWidth = 640
screenHeight = 480
ballS

元記事を表示

【Go】ログイン機能でウェブアプリを作ってみる(6)

こんにちは。

Part 6は仮登録 /auth/register/initial (2)の解説についてです。

## 今回の目標

– ユーザーの仮登録を実装する!

前回まではentity, repository, usecaseを作成しました。
今回はその残りです。

## 仮登録機能の確認
作業を行う前にもう一度それぞれの内容を確認しておきましょう

| パッケージ | 役割 | 機能 |
|:———–|:————|:————|
| Repository | DBとのやりとり | ・emailからユーザーを取得する
・ユーザーを仮登録で保存する
・ユーザーを削除する |
| Usecase | 仮登録処理を行う | ・ユーザーがアクティブかどうか確認する
・アクティブ(本登録)ならエラー
・非アクティブ(仮登録)なら削除して仮登録処理をやり直す
・本人確認トークンの作成
・メール送信 |
| Handler

元記事を表示

Go言語で完全コンストラクタパターンを実装する

## はじめに
これまではPHPをメインで扱っていたのですが、最近はGo言語を使用しています。そこで、Go言語ではどのように値オブジェクト&完全コンストラクタパターン(Complete Constructor Pattern)を実装するのか解説していきます。

## 対象の読者
– Go言語に興味を持っている方
– オブジェクト指向設計(デザインパターン)に興味がある方
– コードの品質向上を目指す方
– PHPからGoへの移行を検討している方

## 完全コンストラクタパターンの基本
### 完全コンストラクタパターンとは?
インスタンスを生成した時点で完全な状態となるような初期化ロジックを、コンストラクタに実装するパターンのことです。

完全コンストラクタパターンを用いることで、オブジェクトが不正な状態で存在することがなくなります。これにより、呼び出し側でオブジェクトが正常かどうかチェックする必要がなくなり、ロジックの重複や修正漏れを防ぎ、保守性の向上が見込めます。

### 注意点 : 生成したインスタンスを不変に保つ
せっかく完全コンストラクタでオブジェクトを完全な状態にしても

元記事を表示

【Go】値レシーバーとポインタレシーバーの実装比較

# ポイント
値レシーバー: 値を更新しない。
ポインタレシーバー:値を更新する。

# 実装例
– 値レシーバー
“`go:main.go
package main

import “fmt”

type Rectangle struct {
width int
height int
}

// 値レシーバーを持つメソッド
func (r Rectangle) Area() int {
return r.width * r.height
}

func main() {
rect := Rectangle{width: 10, height: 5}
fmt.Println(“Area:”, rect.Area()) // Area: 50

// メソッド内で値を変更しても、元のオブジェクトには影響しない
rect.width = 20
fmt.Println(“Area:”, rect.Area()) // Area: 50
}

“`

– ポインタレシーバー
“`go:main.go
package mai

元記事を表示

Go言語によるゲーム開発: Ebitenライブラリの使用方法

## 使用するバージョン
 Ebitenバージョン: 2.2

## Ebitenとは?
EbitenはGo言語でゲームを開発するためのシンプルで使いやすいライブラリです。このライブラリを用いることで、2Dゲームの開発が容易になります。

## Ebitenのインストール
まず、Ebitenをインストールする必要があります。以下のコマンドでインストールできます。

“`go
go get github.com/hajimehoshi/ebiten/v2
“`

## 基本的なゲームの作成
それでは、Ebitenを使用して基本的なゲームを作成してみましょう。ここでは、画面上に四角形を描画し、キーボードの矢印キーで動かすシンプルなゲームを作成します。

まず、以下のコードで新しいゲームの構造体を作成します。

“`go
package main

import (
“github.com/hajimehoshi/ebiten/v2”
)

// ゲームの状態を保持する構造体
type Game struct {
x, y float64 // 四角形の位置
}

f

元記事を表示

【Go言語】JSONファイルからデータを読み込む

【初投稿】
投稿者は初めてQiitaに記事を投稿ですので,読みづらい箇所もあるかもしれませんが、どうぞご容赦いただけますと幸いです。

【記事について】
この記事は投稿者が学んだ技術について記述しております.中には誤っている部分もあるかもしれませんが、どうぞご容赦ください.

# はじめに
この記事では,Go言語におけるJSONファイルの読み込み方法について紹介させていただきます.

# 環境
macOS Monterey (バージョン 12.6.7)
go version go1.20.3 darwin/arm64

# JSONファイルとは?
JavaScript Object Notation(JSON、ジェイソン)はデータ記述言語の1つである.軽量なテキストベースのデータ交換用フォーマットでありプログラミング言語を問わず利用できる.名称と構文はJavaScriptにおけるオブジェクトの表記法に由来する.
([wikipedia](https://ja.wikipedia.org/wiki/JavaScript_Object_Notation#cite_note-1 “Wikip

元記事を表示

Go言語の配列操作の使い難さを改善する

※こちらは,会社の技術ブログとのクロスポスト記事です.元の記事は[こちら](https://www.timedia.co.jp/tech/20230615-tech)

配列操作はプログラムの基本的な機能の一つですが,Go言語は他言語と比較してこの操作が使い難いと感じています.
この記事では,Go言語の配列操作の使い難さを改善した話をします.

# 問題
この記事では,3種類の基本的な配列操作を取り上げます.
* 配列末尾の要素を取得する
* 配列末尾に要素を追加する
* 配列のi番目の要素を削除する

C++, Python, MATLABでの操作を紹介し,その後Go言語ではどのような操作になるか解説します.
そして,Go言語の配列操作の使い難さを改善する方法を紹介します.

# C++
C++の配列操作プログラムと出力は,以下の通りです.
“`c++:main.cpp
#include
#include
using namespace std;

int main()
{
vector nums = {0,1,2,3,4}

元記事を表示

Golang×クリーンアーキテクチャのRest APIでテストを書こう

## 概要

– Golangで書いた簡単なRest API のテストコードを書いてみた記事です。

## 構成

– handler
– HTTPリクエストを処理するハンドラー関数。
– usecase
– ビジネスロジック、各種操作の実行、ハンドラーとリポジトリの橋渡し。
– repository
– DBと接続し、CRUD操作を実施。

ディレクトリ構成(抜粋)

詳細

– 微妙なところはあるかもです。utilとかの置き場所は今考えると微妙です( `internal` のほうが良いかも)。

“`bash
.
├── go.mod
├── go.sum
├── internal #外部に公開しない、プロジェクト内のみで使うロジック。リポジトリの実装もここ。
│ ├── config
│ └── repositories #リポジトリ層(DB操作)
│ ├── fixtures
│ │ └── stocks.yaml
│ ├── s

元記事を表示

[goquic]QUICリバースプロキシを試してみたが上手くいかなかった

## この記事は

[QUIC (Wikipedia)](https://ja.wikipedia.org/wiki/QUIC)によると

>quic-reverse-proxyと呼ばれるDockerイメージが存在し、これは、QUICのリクエストを、オリジンサーバーが理解できる単純なHTTPリクエストに変換するリバースプロキシサーバーとして動作する。

なるものが存在するらしい。
そのDockerイメージがコチラ→[devsisters/quic-reverse-proxy
](https://hub.docker.com/r/devsisters/quic-reverse-proxy/)

このDockerイメージを使って、QUICのリバースプロキシを試してみた

結果として、このリバースプロキシをHTTP/3,QUICで動作させることができなかった
その経緯を書き残し、モチベーションが戻れば、このセーブポイントからやり直したい

## サーバ証明書と鍵の作成

HTTP/3はTLS1.3を前提としている
HTTPS通信するために、[サーバ証明書と鍵の作成](https://www.

元記事を表示

Go言語プログラムの資料を自動生成する

※こちらは,会社の技術ブログとのクロスポスト記事です.元の記事は[こちら](https://www.timedia.co.jp/tech/20230606-tech)

業務でプログラムのドキュメント資料が必要になることがあります.
面倒な資料作成は,なるべく効率的に終わらわせたいですよね.
この記事では,Go言語プログラムの資料を自動生成する方法を紹介します.

# 前提
今回は例として,[Gin](https://github.com/golang-standards/project-layout)というウェブフレームワークの資料を自動生成したいと思います.
目標は,`docs`ディレクトリに資料を用意することです.最初に環境を用意します.

“`bash:Bash
$ git clone https://github.com/gin-gonic/gin.git
$ go install github.com/gin-gonic/gin@latest
$ cd gin/
$ echo */ # ディレクトリ確認
binding/ docs/ examples/ ginS/ int

元記事を表示

OTHERカテゴリの最新記事