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

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

【Go】gRPCのprotoc-gen-validateでenumの必須&値チェックを行いたい

## 概要
以前に[【Go】protoc-gen-validateを含めたprotoファイルでコード出力時に`protoc-gen-go: invalid Go import path`が発生](https://qiita.com/someone7140/items/1a129c69e433cde4d366)の記事で紹介した通り、protoc-gen-validateはprotoファイルでバリデートの定義を設定できるライブラリです。
gRPCではenumも型として使用できるのですが、今回はenumのバリデートを行う際のメモです。

## 前提
* 使用したprotoc-gen-validateのバージョンは`v1.0.2`になります。

## 課題
protoc-gen-validateのドキュメントの[Enums](https://github.com/bufbuild/protoc-gen-validate#enums)に、設定できるバリデーションが記載されています。
これに従って`defined_only`の設定を行えば良いかとなると、今度は[gRPCのEnumを必須チェックした

元記事を表示

Go Interfaceの実装漏れを検知する

## はじめに
GoのInterfaceの実装です。Interfaceを利用すると実装、テストが楽になるのでInterfaceを実装したサンプルを記載します。

## 実装
“`shell:ディレクトリ構成
~/go/src/go_sample$ tree
.
├── domain
│ ├── service.go
│ └── user.go
├── go.mod
└── main.go

2 directories, 4 files
“`

“`go:main.go
package main

import (
“fmt”
“go_sample/domain”
)

func main() {
user := domain.User{}
fmt.Println(user.Walk())
}
“`

“`go:service.go
package main

type IUserService interface {
Talk() string
Walk() string
}
“`

“`go:user.go
package domain

type

元記事を表示

【Golang】複数の struct をマージする【小さな構造体をダイナミックに組み合わせたい】

> Go 言語(以下 golang)で、データのパース用に複数の構造体(以下 `struct`)を組み合わせたい。

JSON データをパースしたいのですが、JSON 側の仕様が整っていないため、微妙に異なるも、ほぼ同じ `struct` を複数用意する必要がありました。

シンプルな構造体を組み合わせてダイナミック(動的)に `struct` を作りたいのですが、ダイナミックと言っても `reflection` などを使うレベルではなく `string` フィールドのみで十分なのです。

[「golang struct マージ」とググって](https://www.google.com/search?q=site:qiita.com+golang+struct+%E3%83%9E%E3%83%BC%E3%82%B8)も、シンプルなタイトルや用途の Qiita 記事がヒットしなかったので、自分のググラビリティとして。

## TL; DR (今北産業)

> [Embedded Struct](https://go.dev/doc/effec

元記事を表示

GORMでSelect用構造体とPreloadingを併用する

Go言語のORMライブラリのひとつ、GORMに関する豆知識記事です。

知識の整理も兼ねて書いているので、説明がくどい部分や内容の誤りが色々とあるかもしれません。ご了承ください。

# 環境情報
* Go v1.20.5
* GORM v1.25.2

サンプルコードの動作確認では、SQLiteを使用しています。
(MySQLでも同様の方法で動作確認済みです)

# 結論
忙しい方のために結論だけ先出ししておきます。

**基本**
“`go
type User struct {
ID uint
Name string
Age int
Gender string
Posts []Post
}

type Post struct {
ID uint
Content string
UserID uint
User User
}

// Select用構造体
type APIUser struct {
ID uint
Name string
}

// Select用構造体
type APIPost struct {
ID

元記事を表示

Go言語とPostgreSQLでハンバーガー予約のAPIを作ってみる:まずGET

作成:2023年8月8日
[前回行ったPostgreSQLの練習の結果](https://qiita.com/RYO_/items/265f6cb3e0834a116118)を使ってAPIを作ってみます。まずはGETから作ってみます。
[今回のコードのGithub置き場](https://github.com/ryoyuki6/api_sql20230730/tree/add_get20230808)です。

# PostgrSQL で DB を準備

## docker-compose.yaml を作成

“`:docker-compose.yaml
# docker-composeで使用するバージョンを定義しています。
version: ‘3.9’
# サービス (コンテナ) を定義します。
services:
# 今回は postgres をサービスとして定義しました。
postgres:
# Docker Image は postgres:12-alpine を使います。postgres:12-alpine は postgres:12 と比較して、イメージサイ

元記事を表示

VSCodeでGo開発環境を作成する

# 初めに
最近 プログラミング言語Go という書籍を使ってGo言語を学び始めたので、
Go言語を学習するうえで必要な開発環境を VSCode で整えた時の内容をまとめようと思います。
ただ、公式サイトに載っていることを自分用にまとめただけなので他人にとって参考になるかは怪しいです。

# 開発環境
開発環境は以下の通りです。
最初は Docker コンテナ上で作業を行っていましたが、PCを再起動するたび作業用のコンテナを立ち上げるのがめんどくなったので、WSL上に落ち着きました。
VSCode の導入は記事上では触れません。
– Windows 11 + WSL2(Ubuntu)
– VSCode

# WSL の導入
WSLは今回よりもだいぶ前に導入しておりやり方を覚えていないため、ググった結果を載せておきます。
“`cmd
wsl –install

# ディストリビューションを選択したい場合
wsl –install -d {ディストリビューション名}
“`
– [日経XTECH Windows 11でWSL2がさらに進化、1コマンドで導入可能に]{https://xt

元記事を表示

Golangのfor rangeでのポインタ問題をLinterで防ぐ

# for range内でのポインタの挙動

まず以下のコードを実行すると、結果はどうなるでしょうか。

“`go:main.go
package main

import “fmt”

type User struct {
id int
name string
}

func main() {
users := []User{{1, “John”}, {2, “Melissa”}, {3, “Robert”}}
var names []*string
for _, v := range users {
names = append(names, &v.name)
}
for _, v := range names {
fmt.Println(*v)
}
}
“`

結果はこうなります。すべて最後のUserの値で置き換えられてしまっています。

“`
Robert
Robert
Robert
“`

これは`for _, v := range`文の中では、毎回同じアドレスが使われていることに起因します。

これを防ぐためには以下のように`[i]`でア

元記事を表示

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

こんにちは。

Part 8は「JWTについて説明してみる」です。

# このチャプターの目次
– JWTとは?
– 何に使うの?
– なんでJWTを使うの?
– 注意点
– 使用パッケージ
– JWTを作ってみた!

# JWTとは?

– Json Web Tokenの略。詳しくはjwt.ioにいくのが一番手っ取り早い
– header.payload.signatureの3つで構成される
“`

eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9.eyJpc3MiOiAieXV5YW4iLCAiaWQiOiAiMTIzNDU2In0.rbpRDicBTBVeqLvTA-Pw1LKZyb7u8Xqid0rgSNGThDY
“`
– headerは署名化の方法
– 上記のJWTのeyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9の部分
– これは{“alg”: “HS256”, “typ”: “JWT”}をBase64URLエンコードし、=を取り除いたもの
– payloadはトークンの中身。idやem

元記事を表示

Go言語 + 準同型暗号 のライブラリ LattiGo のExample を解説 (advanced/lut)

## 概要
今まで触る機会はなかったのですが、
Go言語で実装された格子暗号のライブラリ

LattiGo

を触ってみました。

https://qiita.com/kenmaro/items/20d8c448530354345842

これの続編になります。

Exampleフォルダにあったテストプログラムの解説などを少し書き、
実際に何をやっているExampleなのかを解説してみたいと思います。

## チュートリアルはこちら

今回解説するのは、

https://github.com/tuneinsight/lattigo/blob/v4.1.0/examples/ckks/advanced/lut/main.go

ここにある、advanced/lut のチュートリアルです。

導入については polyeval の解説のところで、

Exampleの中身
勉強したい方へ
の章で書いているので、まだ読んでいなければ読んでみてください。

この記事では早速プログラムの中身に入ります。

## プログラム実行方法

go がインストールされているのは仮定します。

“`ba

元記事を表示

Go言語 + 準同型暗号 のライブラリ LattiGo のExample を解説 (bootstrap)

## 概要

この記事は

https://qiita.com/kenmaro/items/20d8c448530354345842

この続編になります。

今まで触る機会はなかったのですが、
Go言語で実装された格子暗号のライブラリ

LattiGo

を触ってみました。

https://github.com/tuneinsight/lattigo

Exampleフォルダにあったテストプログラムの解説などを少し書き、
実際に何をやっているExampleなのかを解説してみたいと思います。

今回解説するのは、

https://github.com/tuneinsight/lattigo/tree/master/examples/ckks/bootstrapping

ここにある、bootstrap のチュートリアルです。

導入については polyeval の解説のところで、

– Exampleの中身
– 勉強したい方へ

の章で書いているので、まだ読んでいなければ読んでみてください。

この記事では早速プログラムの中身に入ります。

## チュートリアルがやっていることの

元記事を表示

Go言語 + 準同型暗号 のライブラリ LattiGo のExample を解説 (euler)

## 概要

この記事は

https://qiita.com/kenmaro/items/20d8c448530354345842

この続編になります。

今まで触る機会はなかったのですが、
Go言語で実装された格子暗号のライブラリ

LattiGo

を触ってみました。

https://github.com/tuneinsight/lattigo

Exampleフォルダにあったテストプログラムの解説などを少し書き、
実際に何をやっているExampleなのかを解説してみたいと思います。

今回解説するのは、

https://github.com/tuneinsight/lattigo/blob/v4.1.0/examples/ckks/euler/main.go

ここにある、euler のチュートリアルです。

導入については polyeval の解説のところで、

– Exampleの中身
– 勉強したい方へ

の章で書いているので、まだ読んでいなければ読んでみてください。

この記事では早速プログラムの中身に入ります。

## プログラム実行方法

go がインストール

元記事を表示

Go言語 + 準同型暗号 のライブラリ LattiGo のExample を解説 (polyeval)

## 概要

今まで触る機会はなかったのですが、
Go言語で実装された格子暗号のライブラリ

LattiGo

を触ってみました。

https://github.com/tuneinsight/lattigo

Exampleフォルダにあったテストプログラムの解説などを少し書き、
実際に何をやっているExampleなのかを解説してみたいと思います。

## Exampleの中身

今回は、一番実用上使うであろうCKKS形式について解説しようかと思います。

フォルダの中には以下のような4つのフォルダがあり、それぞれチュートリアルプログラムが入っています。

![Screenshot 2023-08-07 at 9.41.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/d1936a63-725d-1891-ec9a-ea60fdad90d5.png)

## 取り組む順番

この中では難易度的に

– polyeval
– bootstrapping
– euler
– adva

元記事を表示

Go言語で昔懐かしのPongを作ってみた話 – スタート画面、反射処理、フィールドの追加

前回の記事ではゴール判定と得点表示を追加しました。
今回はそのコードにスタート画面、反射処理、フィールドのを追加したので記載します。

## 動作デモ

以下は、アップデートされたPongの動作です。
![pong.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143932/1a72a8ef-3027-4053-547a-7511eb4104e9.gif)

## 追加・変更点

1. **スタート画面の追加**:
ゲームが開始されていない状態でのスタート画面を追加しました。
プレイヤーはEnterキーを押すことでゲームを開始できます。

2. **ボールの反射処理の追加**:
ボールが壁やパドルに衝突したときの反射処理を追加しました。

3. **フィールドの追加**:
ゲームの中央にフィールド(線)を追加しました。

## 1. スタート画面の追加

ゲームの状態を管理する`GameState`型を定義し、`Starting`状態を追加してゲームが開始されていないとき

元記事を表示

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

元記事を表示

GolangのTest入門(Step2:複数ケースのテストケース実行)

## はじめに
[前回](https://qiita.com/kouji0705/items/abe2ec6d002194f34d67)の続きです。今回は1つの関数で複数のテストケースを実行するプログラムを書きたいと思います。

## 実装
“`go:product/product.go
package product

func Add(a, b int) int {
return a + b
}
“`

“`go:test/sample/sample_test.go
package sample

import (
“fmt”
“testing”

pr “github.com/kouji0705/go-test/product”
)

func TestAdd(t *testing.T) {
type args struct {
a int
b int
}
tests := []struct {
name string
args args
expected int
}{
{
name: “1+1(成功)”,
args:

元記事を表示

GolangのTest入門(Step1:テストコード実装、実行)

## はじめに
Go言語のテスト実装を1から学び直そうと思い、記事にしています。

## ディレクトリ
“`
~/go/src/go_test$ tree
.
├── go.mod
├── product
│ └── product.go
└── test
└── sample
└── sample_test.go

4 directories, 3 files
“`

## 環境作成
①go.mod initの作成
“`shell:go.mod init
go mod init github.com/kouji0705/sample_test
“`

②プロダクトコード実装
productディレクトリにコードを記載。
初回なので可能な限りシンプルな実装にしようと、引数の和を算出するコードです。
“`go:product/product.go
package product

func Add(a, b int) int {
return a + b
}
“`

③テストコード実装
プロダクトコードで書いたコードをテストします。
“`g

元記事を表示

エンジニア初学者のころの勉強方法について

# はじめに
私がエンジニアとしてキャリアをスタートさせた時に行った演習課題とその解き方を記述します。
エンジニアとなった最初はHTMLとPHPから勉強を始めました。
昨今ではPHP言語が使われることは少なくなってきましたが、保守などに使うことがあること、プログラミングとはどういうものかを理解するのにコストが少ないことから、初めて触る言語としてオススメだと思います。  
私は最初の2ヶ月くらいはPHPを触り、それからGO言語やTypeScriptなどの静的言語の学習を始めました。

本稿では、お馴染みではありますが、繰り返し処理と配列について学んでいきましょう。 
PHPの繰り返し処理だけでは、面白くないので最後にGO言語を使って同じ繰り返し処理と配列を作成します。

# 準備
PHPの実行環境を準備しましょう。
今回の演習では、webページに九九を表示させることをゴールとします。

~~以下の記事を参考に環境を構築してください。~~
実行環境の記事は別途公開予定です。

# 課題
課題は以下の順番で進めていきます。
1. 1の段

元記事を表示

チーム分けアプリの開発:Elo Rating Systemによるプレイヤーのランキングと5vs5のチーム分け 1

## はじめに
この記事では、Elo Rating Systemを使用したチーム分けアプリの開発手順について解説します。Elo Rating Systemは、競技の強さを数値化するアルゴリズムで、チェスなどの競技に広く使用されています。
目標は、Elo Rating Systemを活用してプレイヤーのランキングを管理し、バランスの取れた2つのチームに分けるシステムを開発することです。

## 使用する技術
– バックエンド: Go言語を使用し、Echoフレームワークを採用
– データベース: PostgreSQL
– ORM: GORM

1.プレイヤーデータのモデル化とデータベース設計
– プレイヤーデータのモデルをGoのstructで定義
– データベースのテーブルとプレイヤーモデルを紐付ける

2.データベース接続とリポジトリ層の実装
– GORMを使ってデータベースに接続する
– プレイヤーデータを操作するためのリポジトリ層を実装

3.ユースケース層の設計と実装
– Elo Rating Systemの計算ロジックをユースケース層に実装
– プレイヤーのレーティングの取得や更

元記事を表示

Golangの基礎まとめ

# はじめに
こちらの記事は以下Udemy講座で学んだ内容をベースに作成したものです。
https://www.udemy.com/course/golang-webgosql/
より詳しく学びたい方は実際に受講いただくのがいいかと思います。
既に受講された方は復習などでお使いください。

# データをコンソールに表示
標準パッケージの`fmt`を使用する。
`Println`は最後に改行が入る。似た関数では`Print`や`Printf`がある。
“`Go
package main

import “fmt”

func main() {
fmt.Println(“Hello World”) // コンソールにHello Worldと表示される
}
“`

# Goの実行方法
## go run
簡単な実行方法。
ファイルを指定するだけでプログラムを実行できる。
“`Bash
go run ファイル名
go run main.go // 例
“`

## go build
コンパイルしたファイルを作成する。その後作成されたファイルを実行することができる。
“`Bash
g

元記事を表示

[Go言語]インストール〜実行(環境構築)

# はじめに

* 実務がフロントエンドメインになってきてるので、バックエンドのキャッチアップも行いたかった。
* スタートアッププロジェクトなど、GO言語が使われ始めてるのでやっておいて損はなさそう。
* バックエンドはJavaをやっていたので、javaにはない良さがあるといいな。

# Goのインストール

* PCはMac。homebrewをインストール済みであること。

“`
> brew install go
“`

* これだけ。パスの設定も必要なかった。バージョンが表示されればOK。

“`
> go version
go version go1.20.7 darwin/arm64
“`

# Goの実行

* `go run 実行ファイル/goファイル`
* buildで作成した実行ファイルを指定することで実行する。
* goファイルを指定した場合は、コンパイルせずに実行できる。手軽に試した場合に実施する。
* 内部的には、コンパイルファイルを一時領域に作って、終わったら削除している
* `go build ファイル名`

元記事を表示

OTHERカテゴリの最新記事