Go関連のことを調べてみた2022年12月22日

Go関連のことを調べてみた2022年12月22日

【Go】DIライブラリを使ってみる

# はじめに
クリーンアーキテクチャやUTの実装を簡単にするための技術としてDIを導入することがほぼ必須となっているが今回はGo言語のDIライブラリであるWireを使ってサンプルプログラムを実装してみた。
筆者の経験として今までJavaでSpringによるアノテーションを使ったDIとScalaでAireframeを使ったDIがあり、JVM言語以外ではDIを使ったプログラミングをしたことはない。

# Wire
Google製のDIライブラリ
wire.goに依存関係を記述してコマンドを実行すると別のGoファイルが生成されて依存関係を解決したインスタンスを作ることができる。

https://github.com/google/wire

# クラス図
下記の通りUserService構造体のメンバ変数としてIUserRepositoryインターフェースが定義されておりそれを継承した構造体としてuserRepository1とuserRepository2が存在している。
UserService構造体を生成するときrepoにuserRepository1とuserRepository2を

元記事を表示

[go] [terraform] lambdaのsource_code_hashが毎回更新される

# 前提
goのバージョンとterraformのバージョンは以下
今回の記事の対象は恐らくgo 1.18以降を使っている人
“`shell
go version
go version go1.19.2 darwin/arm64
terraform -v
Terraform v1.3.6
“`

# 今回の問題
terraformで以下のようなコードでlambdaのリソース管理をしていた
“`terraform
resource “aws_lambda_function” “go_function” {
filename = “go_function.zip”
function_name = “go_function”
handler = “main”
source_code_hash = filebase64sha256(“go_function.zip”)
runtime = “go1.x”
}
“`
`go_function.zip` はgithub actionsのworkflow内でbuild

元記事を表示

休日Gopherが育ててきたMakefile

# はじめに

この記事は [Go Advent Calendar 2022](https://qiita.com/advent-calendar/2022/go) 22日目の記事です。

休日Gopherシリーズ第2弾です。
`Go`の業務経験が少ない私が個人開発をするときに育ててきた`Makefile`を公開します。

※ 第1弾:[休日Gopherとしての1年半を振り返る](https://qiita.com/_otakakot_/items/d64bb4e20f64937d405e)
※ 休日Gopherとは私が勝手に作った言葉です。休日にしか`Go`を触る機会がないGopherをそう呼んでいます。

# 想定読者

– `Makefile`を利用するGopher
– `Makefile`に興味があるGopher

# 実行環境

Mac/Linuxでの実行となります。
私が実行している環境は以下となります。
(`uname -a`の結果となります。)

“`shell
Linux HP-Spectre-x360 5.4.72-microsoft-standard-WSL2

元記事を表示

Goでpingを実装する

本記事は DeNA 23 新卒 Advent Calendar 2022 の22日目の記事となります.

https://qiita.com/advent-calendar/2022/dena-23-shinsotsu

# はじめに

主に指定の宛先とのラウンドトリップタイムを計るときに使う **ping** というソフトウェアがあります.主に回線状況の確認の目的で使われることの多いこのソフトウェア,OS問わずに利用可能であることもあり,使用経験のある方も多いのではないでしょうか.
私も時折使っていたのですが,内部的にどのように通信が行われているのかというところをしっかりとは理解できていなかったところがあります.

本記事はその理解を深めることを目指し,周辺の知識を復習しながらGoによってpingを実装したことをまとめたものです.

# ICMP

pingはICMP(Internet Control Message Protocol)というRFC792で定義されたプロトコルを利用します.

https://www.rfc-editor.org/rfc/rfc792.html

ラウ

元記事を表示

Kinesis Data Firehoseを用いてJSTでパーティショニングする

# はじめに

オークファン開発部で新卒2年目として働いてる@isodaです
業務でKinesisを用いたapiの実装に携わり、そこで得た知見などを備忘録として残したいと思います

# Kinesis Data Firehoseの設定
今回の題名にもなっているJSTでパーティショニングする方法ですが、デフォルトのパーティションだとUTCでパーティションされてしまう為、動的パーティショニングを設定します
– ソース
– Direct Put
– 送信先
– S3
– 配信ストリーム名
– test-stream
– S3 バケット
– test-bucket
– 動的パーティショニング
– 有効
– JSON のインライン解析
– 有効
– 動的パーティショニングキー
– キー名 | JQ 式
– year | .ymd[:4]
– month | .ymd[4:6]
– day | .ymd[6:8]
– S3 バケットプレフィックス
– data/!{partitionKeyFromQuery:y

元記事を表示

Go(gin)のテストで配列をFormDataとしてPostしたい

# はじめに
タイトルの件で調べても解決に時間がかかってしまったので簡単にまとめてみます

# 解決方法
– url.Valuesに”配列をpostする際は{“1”, “2”}と書く
– 構造体のタグにformを指定する
– Bindする

“`hoge_controller_test.go
t.Run(“hogeが作成されること”, func(t *testing.T) {
r := controllers.StartMainServer()
formData := url.Values{
“form1”: {“1”, “2”},
}

req, _ := http.NewRequest(“POST”, “/hoge_new”, strings.NewReader(formData.Encode()))
req.Header.Set(“Content-Type”, “application/x-www-form-urlencoded”)
test := httptest.NewRecorder()
r.ServeHTTP(test, req)

元記事を表示

Goのテストコードを一気に並行動作できるようにするツール「tparagen」を作った

本記事は[Go Advent Calendar 2022](https://qiita.com/advent-calendar/2022/go) & [カンム Advent Calendar 2022](https://adventar.org/calendars/7789)の記事になります。

## 何を作ったか
以下のデモのように、**コマンドを1回実行するだけで対象リポジトリ内のテストを最大限に並行実行に対応させるツール**を作りました。

—-

## なぜ作ったか
Goの`testing`パッケージを使ったテストコードの実行は、`go test`コマンドの`-p`オプションで明示的に並列実行の制限をしない限り、複数のパッケージが並行にテストを実行するようになっています。
開発者が意識しなくともテストの実行が最適化されるようになっており、このような仕組みはJavaScriptのテストフレームワーク[Je

元記事を表示

golang-migrateでmigrateできない時の確認事項【備忘録】

## 問題
golang-migrateでmigrateしようとするとエラーを吐かれる.
なぜ今roleの問題が発生する?
“`
$ migrate -path db/migration -database “postgres://postgres:pass@localhost:5432/postgres?sslmode=disable” up
$ error: pq: role “postgres” does not exist
“`

## 対処
先に対処法から紹介.
Path等に誤りがない場合、**ローカルでPostgresが起動しているか確認**.
起動している場合は停止させてから再度migrateを試みると通る!..かもしれない.

ちなみにMacで停止させる場合は以下のコマンドを使う.
“`
$ brew services stop postgresql
“`

## 原因
ローカルでPostgresが同一のポート(大抵は5432)で動いている場合はローカルの方に接続されてしまうらしい.

## 参考
[Go言語とPostgreSQLで遊ぼう!~マイグレーション編~

元記事を表示

教育版・統合版マイクラ x micro:bit連携プログラミング環境をつくる

この記事はmicro:bitアドベントカレンダー2022に参加している記事。
micro:bitアドベントカレンダー2022 22日目

https://qiita.com/advent-calendar/2022/microbit

# マイクラをmicro:bitと接続できないだろうか

そんな問いかけから始まったプロジェクトだったワケだが、まずは自分で実装するよりも先人の知恵を借りてみようとググってみるとやっている人は結構いるのだと分かった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13920/338c3d33-a7b1-7124-1d57-47e16e3a2095.png)

教育版・統合版マイクラはベースが同じものなので機能が共通しているところが多い。元々、これらのマイクラはプログラミング機能を付加することができるCode Connection for Minecraftという別アプリとWebSocketプロトコルで連携して機能拡張を実現していた。

このWebSocke

元記事を表示

GoとUnityとSQLでちょっとしたソシャゲとか用のユーザ認証とセッションを作りたい

### この記事はゲーム制作者の発表の場アドベントカレンダーに参加中です。
https://adventar.org/calendars/8046
ゲーム制作にかかわる人が自由な記事を作る Advent Calendar 2022 22日目担当、Fuseです。
サーバサイドに興味を持ったので、サーバサイドの記事を書きました。
今回は色々使えそうなユーザ認証とセッションを作っていきます。

# まえがき
+ 著者はGo言語初学者です。なのでお見苦しいところがあるかもしれませんがご了承ください。
+ 巷ではやりの`Go言語`と`PostGreSQL`と`Unity`でソシャゲとかに使えるユーザ認証を作っていきます。
+ ゲームとしての処理はサーバ側に実装、クライアントであるUnity側は与えられたデータを表示するのみとします。
+ 単純な実装では無く、セキュリティやチート対策なども意識して作っていきます。
+ 今回は技術検証がメインのためゲームの面白さは度外視とします。
# 完成品
### サーバー側
https://github.com/Fuses-Garage/UnityGo
###

元記事を表示

Windows(WSL2)でとりあえずGo言語を書けるようにする

# はじめに
とりあえずGo言語を書く環境を用意したかったのでやったことのメモ。

# 前提
WindowsにWSL2インストール済
WindowsにVisual Stuidio Codeインストール済
WSL2にUbuntu 20.04.5 LTSインストール済
UbuntuにVisual Stuio Codeインストール済

# UbuntuにGo言語をインストールする
[このページのUsin PPAの通りにコマンドを打つ(これで最新版が入る)。](https://github.com/golang/go/wiki/Ubuntu)
> sudo add-apt-repository ppa:longsleep/golang-backports
sudo apt update
sudo apt install golang-go

# VSCodeにGoの拡張機能をインストールする
“Go”で検索すると出てくるこれをインストールする。
![2022-12-21 (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaw

元記事を表示

みんなのPRレビュー負荷を可視化してみた(Vue × Go × GitHub API)

# 概要
PRでレビュワーを設定する際の基準の一つになるかと思い、チームのPRレビュー負荷を可視化するSPAを作ってみました

# DEMO

Searchボタンの下部に表示しているデータは`v-bind`を使っているので、実際には動的に表示されます

# 成果物
詳細は下記リポジトリのREADMEに記載しました

https://github.com/rabitt1ove/reviewer-load-check

# 課題
– ローカル環境のみで動作確認しましたが、社内公開する場合はGitHubの`Personal access token`を外部流出させないよう、サーバのOSの環境変数に登録するなどしてプログラムから参照したらいいかも
– Goで作成した処理を全てJSに置き換えたら`Private GitHub Pa

元記事を表示

Goで構造体をシリアライズしてURLパラメーターに付与する

## お詫び
AdventCalendarの21日目の記事なのですが、筆者がコロナになってしまって書ききれなかったので途中ですが公開だけいたします………。
残りは動けるようになってから仕上げます。

## この記事について
こちらの記事は[CyberAgent AI tech studio | Go Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ca-ai-go)の21日目の記事です。

## 筆者について
筆者は業務で書くGo歴は2ヶ月くらいで割とペーペーな部類です。
前職ではPHPを主に書いていたのですが、転職を機にGoを使い始めそのタイミングで社内のAdvent Calendarが開始されたので思い切って参加してみました。
記事内容に対する意見、提案、改善等大歓迎です!

## 概要
業務中にURLパラメーターを用いて多めの値を受け渡しするという要件に遭遇しました。
単純に`https://example.com?a=a&b=b&c=c&d=d….`とすべての値を羅列する方法も当初は考えました。

元記事を表示

DockerでGo言語のREST APIの構築

# 環境
– macOS Monterey 12.6.0

# Docker Desktopをインストール
– [Docker.dmgをダウンロード](https://docs.docker.com/desktop/install/mac-install/)
– Docker .dmgをダブルクリックし、Docker iconをApplicationフォルダへ移動
– ApplicationフォルダーでDocker iconをダブルクリックし、Dockerを起動
![スクリーンショット 2022-12-21 13.29.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987895/c73f52b5-f670-9fd7-87e2-6b7724f3b24b.png)

# ターミナルを開き、REST API用のプロジェクトを作成
– 普段プロジェクトのフォルダーへ移動し、新たなフォルダーを作成(自分の場合、Projectsフォルダーへ移動、RESTAPITESTのフォルダーを作成)

~~~linux

元記事を表示

Goでユニットテストを書くためのTips

## はじめに
本記事はHRBrainのAdvent Calendar21日目の記事です。

https://qiita.com/advent-calendar/2022/hrbrain

こんにちは!!!
HRBrainでバックエンドエンジニアをしている@darkroです。
寒さが一段と厳しい今日この頃ですが、サッカーW杯で盛り上がり、M-1グランプリで盛り上がり、アドベントカレンダーでも盛り上がっていきましょう!!!

さて、本日のテーマはGoのユニットテストについてです。
皆さんはユニットテストをちゃんと書いていますか?
– 最速リリーススケジュール優先でユニットテストを書く時間を見積もっていない
– 結合テストをやっているから大丈夫
– 効果が実感できない、必要性がわからない

などなど、理由をつけてついつい疎かになっていませんか?
確かにユニットテストを省くことで動くものをそれだけ早く出せるかもしれません。
しかし、その分そのコードは信頼性が損なわれていると言っていいと思います。実際に私もユニットテストのお陰でリリース前に考慮漏れや事前にバグを検出できたケースをいくつも経験し

元記事を表示

O’REILLY の『Go言語でつくるインタプリタ』が良かったので、続きの洋書『WRITING A COMPILER IN GO』 もやってみた

この記事は [Go Advent Calendar 2022](https://qiita.com/advent-calendar/2022/go) カレンダー 2 の 21 日目の記事です。

『WRITING A COMPILER IN GO』という書籍を読んでコンパイラを作ってみたので、その書籍について紹介します。

## 『Go言語でつくるインタプリタ』と『WRITING A COMPILER IN GO』について

まず、『Go言語でつくるインタプリタ』については、
O’REILLY から 2018 年に日本語訳版が発売されたものとなります。

書籍で想定したオリジナルの言語 `Monkey` のインタプリタを実装していくという内容になっています。
ステップバイステップで少しずつ作っていく流れがわかりやすく、私も楽しくインタプリタの作成を実践することができました。

https://www.oreilly.co.jp/books/9784873118222/

そして、今回紹介する書籍は『WRITING A COMPILER IN GO』というタイトルのもので、

元記事を表示

スライスのゼロ値を Print すると [] が出力される理由を探ってみた

この記事は[フラー株式会社 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/fuller-inc)の21日目の記事です。

## 前書き

以下を実行すると “`“`が出力されます。

“`go
func main() {
fmt.Print(nil) // ->
}
“`

ところで、[Goの言語仕様](https://go.dev/ref/spec#Slice_types)により、スライスのゼロ値は“`nil“`です。そのため、スライスを宣言しプリントすると、“`“` が出力されると期待しますが、実際は“`[]“`が出力されます。この記事はその謎を追いました。

“`go
func main() {
var a []int
fmt.Print(a) // -> []
}
“`

## ネタバレ

“`[]“`が出力される理由は、“`fmt.Print“`を適用した“`a“`の実行時の型がスライス型であり、
“`fmt.Print“`

元記事を表示

Goでモデルのカラムを配列として定義したい

# はじめに

モデルの一部のカラムを配列で定義する際、テーブル作成が出来ずに詰まったので解決までの流れを簡単にまとめてみます

## ①pqパッケージのStringArrayで定義すると

“`Catalog.go
import “github.com/lib/pq”

type Catalog struct {
gorm.Model
Title string `gorm:”not null”`
Comments pq.StringArray
“`

以下を参考にしましたが、こちらはPostgreSQL用でした

https://gorm.io/ja_JP/docs/data_types.html

今回使用しているのはMySQLなので以下のエラーが発生し、テーブル作成ができませんでした

“`
Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax

元記事を表示

Goのユニットテストをtestify・テーブル駆動テストで実装した話

この記事はNewsPicksアドベントカレンダー2022の21日目の記事です。

https://qiita.com/advent-calendar/2022/newspicks-tech

# この記事の概要

この記事は、新規プロダクト(toBマルチテナントSaaS)の開発に参加しているインターン生がusecaseのユニットテストを実装するタスクに取り組んだ際に、

– どのような実装をしたか
– どのようなレビューをいただいたか
– どのように修正したか

といった部分を徒然なるままに書いた、なんちゃってインターン体験記 ~~(自分語り)~~ です。

AlphaDriveのインターンに参加した際に、どのような形で開発に関わっていけるかのイメージを掴むための一助となれば幸いです。
また、Go及びtestifyを用いたテストコードの書き方の一例として、温かい目で読んでいただければと思います。

# 自己紹介

2022年8月から[AlphaDrive/NewsPicks](https://adnp.alphadrive.co.jp/)にてインターンとしてお世話になっております。[t

元記事を表示

go testのチュートリアルを作ってみた

# はじめに
この記事は[ディップ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/dip-dev)の21日目の投稿です。
早いもので今年のアドカレも残すところあと5日となりました。

弊社ではGoを用いたプロダクトが拡大中+内製化のため鋭意増員中です。
いずれのプロダクトでも単体テストを書く文化が根付いているため、
新規参画メンバーが早く馴染めるように`go test`のチュートリアルを作ってみました。

https://github.com/dip-dev/go-test-tutorial

# どんなもの?
あらかじめ実装されているコードに対し、単体テストを作成するチュートリアルです。

テストケースの作り方と[gomock](https://github.com/golang/mock)の使い方が学べる内容になっており、
Goに初めて触れる、単体テストを書いた経験が少ないひとをターゲットとしています。

課題はchapter5まであり、徐々に難易度が上がっていきます。
また、後半のchapterは実践向け

元記事を表示

OTHERカテゴリの最新記事