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

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

Go の web server で nginx のアクセスログっぽいものを出す

# はじめに
Go の net/http で web server を立てた際に、手前に nginx などのプロキシを置くパターンと置かないパターンがあると思います。
rails などでは c10k やバッファリングの問題から nginx とセットで構築することが多いように思いますが、go の場合 goroutine がうまいことやってくれるので nginx などのプロキシを置かないケースがあります。
置かない時に nginx が出してくれる相当のアクセスログを go で出したいな、となったので http と gRPC それぞれで実装したサンプルです。

# http server

アクセスロギングのような共通処理は [middleware パターン](https://pkg.go.dev/go.ntrrg.dev/ntgo/net/http/middleware)が適しているので、独自 middleware を作って、http server に差し込みます。
以下はその middleware の実装例。

“`access_logger.go
package middleware

元記事を表示

Goでモックを作成してテストをする

この記事は [弁護士ドットコム Advent Calendar 2022](https://qiita.com/advent-calendar/2022/bengo4com) の7日目の記事です。

# はじめに

Go のテストにおいてインターフェースからモックを生成する gomock の基本的な使用からサンプルコードを使ってテストコードを書くところまでを説明します。

# golang/mock とは

Go 公式が提供しているライブラリで、インターフェースの定義からモックを生成することができます。

– **mockgen** … モックを自動生成するツール
– **gomock** … 生成したモックを扱うパッケージ

https://github.com/golang/mock

## インストール

README に記載されている通りにインストールしてください。
`mockgen` というCLIツールと `gomock` というパッケージの両方をインストールする必要があります。

– **mockgen (初回のみ)**
“`bash
$ go insta

元記事を表示

Goのslice比較でテストがFlakyになったってハナシ

# はじめに
こんにちは。HRBrainでバックエンドエンジニアをしている[@tonarinohey](https://twitter.com/tonarinohey)です。
本記事は[HRBrainのAdvent Calendar](https://qiita.com/advent-calendar/2022/hrbrain)7日目に公開されました。

突然ですが皆さんは「クリスマス」って知っていますか。
僕は最近知りました。

先日2歳を迎えた息子も、保育園やYouTubeから「サンタさん」や「クリスマスプレゼント」なる概念を注入されてしまったらしく、無事カプセル化に失敗しています。

息子「ぶーぶ(自動車。空を飛ばないものだけを指す)、ちょーだい」

また我が家にトミカプレミアムが納車されるのか。うちのリビング、すでに大黒PA[^1]みたいになってんのに。
[^1]: 神奈川県横浜市鶴見区の首都高速道路神奈川5号大黒線上にあるパーキングエリア。リアル湾岸ミッドナイトな人たちに根強い人気がある。

クリスマスプレゼント、鮭フレークとかじゃ駄目かな。
子ども、鮭フレーク好きだし。僕も

元記事を表示

AppleログインでIDトークンを取得したら、email_verifiedクレームの型が2種類あって困った話

:::note info
これは [ZOZO Advent Calendar 2022](https://qiita.com/advent-calendar/2022/zozo) カレンダー Vol.4 の 7 日目の記事です。
:::
以下、Goを使用する前提で話を進めています。

# 何が起きたのか
Appleログインを実装する過程で、Appleから送られてきたIDトークンを構造体にパースしたら`*json.UnmarshalTypeError`になっちゃいました。

# 原因
以下の構造体にパースするつもりでしたが、取得したIDトークンの`email_verified`がstring型だったのでパースできなかったわけですね。
“`go
type Profile struct {
Email string `json:”email”`
EmailVerified bool `json:”email_verified”`
}
“`
じゃあEmailVerifiedフィールドをstringにすればいいだけじゃないか、解散解散!
って思われたそこの

元記事を表示

go言語の基本のテスト Hello world的な

# Goのテスト入門

TDDをしたいのでテストを書いてみよう。

## 基本のテスト Hello world的なテスト

役に立たないけど、基本的なテスト

ファイル:main.go
“`
import “fmt”
// テスト
func isOne(i int) bool {
if i == 1 {
return true
} else {
return false
}
}
func main() {

fmt.Println(isOne(1))
fmt.Println(isOne(0))

}
“`
関数 isOneをテストしたい場合、テストファイルを作成する。ファイル名:main_test.goで作成する。
“`
package main

//テスト
import “testing”

var Debug bool = false

func TestIsOne(t *testing.T) {
i := 1
if Debug {
t.Skip(“スキップさせる”)
}
v := IsOne(i)
if !v {
t.Errorf(“

元記事を表示

Goのクロスコンパイル(MacでビルドしてRaspberry Pi Zeroで実行)

Raspberry PiでGo(gin)のプログラムをビルドしたら割と時間がかかったので、手元のMacでRaspberry Pi用にビルドすることにした時のメモ

# Goでビルド時のターゲットに指定できるプラットフォームを確認 
以下を実行するとビルドのターゲットに指定できるプラットフォームのリストが出力される。
Raspberry Pi ZeroでLinux系のOSを使用している場合はlinux/armが該当するのでクロスコンパイルが出来そう。
“` shell
% go tool dist list
aix/ppc64
android/386
android/amd64
android/arm
android/arm64
darwin/amd64
darwin/arm64
dragonfly/amd64
freebsd/386
freebsd/amd64
freebsd/arm
freebsd/arm64
illumos/amd64
ios/amd64
ios/arm64
js/wasm
linux/386
linux/amd64
linux/arm
linux/arm64
l

元記事を表示

k6 のテスト結果を datadog で可視化してみる

この記事は [弁護士ドットコム Advent Calendar 2022](https://qiita.com/advent-calendar/2022/bengo4com) の 6 日目の記事です。

# k6 とは
k6 とは Grafana Labs とそのコミュニティによって開発されている OSS で、パフォーマンステストを簡単に行うことができる負荷テストツールです。特徴としては以下のような点があります。

* OSS 版とクラウド版がある
* テストシナリオを Javascript で記述する
* HTTP / WebSockets / gRPC などのプロトコルに対応している
* 結果を Grafana はもちろん Datadog等でも可視化できる

https://k6.io/

インストール方法は [ここから](https://k6.io/docs/get-started/installation/) 確認できます。

# 今回やること
今回は k6 を使って golang製サーバーへ負荷テストを実施し、試験経過を Datadog で可視化するところまでやってみようと思

元記事を表示

entで実行されたSQLを確認する

## はじめに
[株式会社 RetailAI X Advent Calendar 2022](https://qiita.com/advent-calendar/2022/retail-ai-x) 6日目の記事です。

最近、Go言語のORMである[ent](https://entgo.io/ja/)を触っています
自分が書いたプログラムがイメージ通りのSQLを発行できているのか確認したい時があったので、やり方を調べてみました

## データ取得処理
### 通常時
“`
client.User.Query().All(ctx)
“`
clientの中身は[こんな感じ](https://entgo.io/docs/crud#create-a-new-client)に作ります

### SQLを確認したいとき
“`
client.Debug().User.Query().All(ctx)
“`
clientに対して`Debug()`を実行すると、新しいデバッグクライアントが返却され特定の操作に対して詳細なログを取得することができます

“`
2022/12/03 01:34:5

元記事を表示

Go言語で桁数指定可能な四捨五入関数を作る

こちらは、HRBrain Advent Calendar 2022 6日目の記事です。

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

どうもこんにちは、HRBrainでバックエンドエンジニアとして働いてる藤原です。1年に1度のペースで記事を書いております。

今回は、小数を任意の桁数で四捨五入する関数をGo言語で作りたいと思います。 その実現方法と注意点について書いていきます。

# Go言語の標準の四捨五入関数
Go言語標準の`math.Round`関数が用意されています。
しかし、こちらは桁数指定ができず、小数第一位を四捨五入して整数にするというものです。
“`golang
func Round(x float64) float64
“`
https://pkg.go.dev/math#Round

今回は桁数指定までできる、より汎用的なRound関数を作っていきたいと思います。

# まずは素直に実装してみます

“`golang
func Round(num float64, pos int) float64

元記事を表示

Goの関数ではゼロ値はリテラルで返してほしい気持ちをLinterで綴る

## 何を作ったのか

どうも[株式会社ナレッジワーク](https://kwork.studio/)の@tenntenndです。

以下のような、変数をそのまま返しているやつ嫌ですよね。それをチェックするツールを作りました。

“`go
func f() struct{} {
v := struct{}{}
return v // ヤダ
}

func g() (v struct{}) {
return v // ヤダ
}
“`

https://github.com/gostaticanalysis/zerolit

## どう作ったのか

Goには静的解析ツールを作る機能が標準ライブラリで提供されています。詳しくは[分厚いスライド](https://tenn.in/analysis)をご覧ください。

ざっくりとしたアルゴリズムは以下の通りです。

* 代入文を探し、ゼロ値じゃない値を代入しているものに印を付ける
* `return`文で変数を返しているものを見つける
* その変数がゼロ値じゃない値を代入してる印がついていなけれ

元記事を表示

Goでdiffコマンド書いて実際の実装と比べてみた

# はじめに

こんにちは。にしやまです。
この記事は[TechCommit AdventCalendar2022](https://adventar.org/calendars/7673)の6日目の記事です。
昨日はTomoさんの[【振り返り】2022年・週1回の輪読会を継続して良かった点・改善点](https://zenn.dev/h2tomo/articles/754d64a35bae13)でした。

# 概要

アドカレのネタどうしようと考えた結果、Goでdiffコマンドを実装してみようと思ったので、

– 実装してみたものの解説
– 実際のdiffコマンドの実装がどうなっているか読んで比べてみる

について書いてみます。

# 実装してみたものの解説

わりと手抜きなので、オプションなしで2ファイルの全比較のみしかできません。
また、実際のdiffコマンドのコードはこの時点では見ずに想像で書いているので実際のものとは実装が結構違うかもしれません(この後でそれを検証します)

## コード
こちらです。
コメントで多めに解説も書いています。

“`go
package ma

元記事を表示

runnを使ったWebバックエンドのe2eテスト

こちらは [HITOTSU株式会社 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/hitotsu) の5日目の記事になります。

こんにちは、[HITOTSU株式会社](https://hitotsu.co.jp/)にて、業務委託でプロジェクトに参画させていただいている [こうりん](https://twitter.com/Kourin1996) と申します。

HITOTSU内では、現在進めているプロダクトの技術選定から関わらせて頂いており、主にWebバックエンド開発に携わっています。(たまに、Reactのフロントエンドのコードを書いたりもします)

HITOTSUのプロダクトのWebバックエンドはGoを使っており、軽量Webフレームワークとして [labstack/echo](https://github.com/labstack/echo) を使用しています。

この記事では、Webバックエンド向けのツールとして [runn](https://github.com/k1LoW/runn) をご紹介させてい

元記事を表示

安西先生…!! ………書籍管理アプリを作りたいです……

安西先生…!!
………書籍管理アプリを作りたいです……
………
………
…Goで…
…読みやすいコードで…
…GraphQL…導入しましょう…
…あわよくばDDDも取り入れてみたいですね……

## この記事の目的
話題になっていた ChatGPT を触ってみたかった。
ChatGPT がどこまでコードを書けるのか気になった。
面白そう!

## ChatGPT ってなに?
twitter で見かけたのが最初ですが、こちらが質問したことに回答をしてくれる AI です。
↓ こんな感じです。
“`
自分: 元気ですか?
ChatCPT: はい、元気です。

自分: 今あなたが一番欲しいものはなんですか?
ChatCPT: 今一番欲しいものは、健康であり、幸せな毎日を過ごせることです。

自分: それはとても素晴らしいですね
ChatCPT: はい、ありがとうございます。

自分: 何か質問はありますか?
ChatCPT: いいえ、今は特に質問はありません。

自分: 質問してみてください。なんでも

元記事を表示

【Go/GCP】gin+entでCloud SQLと繋がるAPIを作る

# まえがき

野村総合研究所のk4nd4(かんだ)です。普段はVueやらTypeScriptやらに関わった活動をしていますが、Go言語にも興味がありプライベートで勉強していました。
本日はその一環で得たノウハウを記事にしてみます。ド初心者ですのでお手柔らかに・・・。

# やりたいこと

### Cloud SQL上のDB(Postgres)に接続し、データを読み書きするAPIをginで作成する。

– 今までNoSQLばっかり触ってきていたのでたまにはRDBも使いたい
– 業務ではAWSやAzureが多いが、個人的にはGCPが好み
– というわけでCloudSQLを使ってみたい
– そのくせしてSQLを書きたくないのでORMを介してデータ操作したい
– というわけでentを使ってみたい
– 有名所のフレームワークを使ってAPIを作ってみたい
– というわけでginを使ってみたい

# Cloud SQLの準備

GCPでCloud SQLのインスタンスを作成します。
今回はPostgresを選択しました。

具体的な手順は画面に従ってクリックで選んでいくだけなので

元記事を表示

CSVをgrepできるようにするコマンドを作った

この記事はGo Advent Calendar 2022の5日目の記事です。

CSVをgrepできるようにするコマンドを作ってみました。
CSVを検索するコマンドではありません。
grepと連携するコマンドです。

## 経緯

CSVのセルには改行文字が含まれ得ます。
改行文字の含まれるCSVをgrepすると、CSVのセルが壊れます。

具体的には、以下のようなCSVをgrepすると壊れます。

“`bash
$ cat testdata/sample1.csv
Language,Word,Note
English,”Hello
World”,note
Japanese,”こんにちは
こんばんは”,メモ
English,”John
Rose”,
Japanese,”太郎
花子”,

$ grep Japan a.csv
Japanese,”こんにちは
Japanese,”太郎
“`

grepで検索した文字列にマッチする行を抽出しつつ、
CSVフォーマットとして壊れないようにgrepしたかったわけです。

CSVを検索するツールとかは探せばあるんですけれど、grepの検索機能を

元記事を表示

【Vonage】Vonage SDKを使ってWebアプリで電話番号認証を実装【Go】

この記事は [VonageコミュニケーションAPIを使ってみた、Vonageのことなら何でも共有しよう! by Vonage Advent Calendar 2022](https://qiita.com/advent-calendar/2022/vonage) に参加しています。

## はじめに
私は昨年、Vonageさんのアドベントカレンダーを見かけて ↓ のような記事で参加させてもらいました。GoのSDKが見当たらなかったので作ってみる!という試みでしたが、終盤で「あれ、まだ大々的に紹介されてないけどGoのSDK開発中ですね!」と気づくという、ちょっと残念な結果に :sweat:

https://qiita.com/tenkoh88/items/6e97f28bc9dbb37a2e36

今回はそのリベンジの位置付けで、Vonageさんの`Verify API`をSDKを活用して使用する方法を、シンプルなWebアプリケーション例を通じて試してみました。

## この記事の内容
– おさらい:Vonageから提供されているサービス
– 電話番号を使った多要素認証の流れ
– G

元記事を表示

大規模リクエストを捌くコツ

# 記事作成の背景
先日、大規模リクエストを捌く計測サーバ構築を学習する機会があったので
そのアウトプットとして残します!!

## コツ
大規模リクエストを捌くコツは簡潔に言うと、以下の2点です!
1. DB周りの設定をしっかり行う
1. ネットワークコストを減らす

このコツに関して色々とお話します!
以下の流れで進んでいきます!
1. [改善前](#改善前)
1. [GoのDB周りの設定とコードの修正](#goのdb周りの設定とコードの修正)
1. [バルクインサート](#バルクインサート)
1. [改善後](#改善後)
1. [感想](#感想)

## 改善前
### パッケージ
1. net/http
1. log
1. go-sql-driver/mysql

### ソースコード
“`go:main.go
package main

import (
“net/http”
“log”

“database/sql”

_ “github.com/go-sql-driver/mysql”
“os”
)

func main() {
dataSourceNam

元記事を表示

GORMで実行されているSQL文を出力してデバッグする2つの方法

# TL;DR
Go言語のORMライブラリであるGORMを使った開発にて、SQL文を確認しながら実行する方法をご紹介します。

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

単一のSQLを確認したいとき
“`go
db.Debug()..Create(&Product{Code: “D42”, Price: 100})
“`

全体の流れを追いたいとき
“`go
db.Logger = db.Logger.LogMode(logger.Info)
“`

と処理を追加すれば標準出力にSQL文が出力されるようになります。

# サンプルコード
GORMのサンプルコードを少し改変して、DB処理を含むGoのコードを書いてみました。

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

“`go:main.go
package main

import (
“log”

“github.com/joho/godotenv”
“github.com/kelseyhightower/envconfig”
“gorm.i

元記事を表示

ハッカソンに参加してきた話

# はじめに
みなさん、こんにちは
Amebaの広告プロダクトチームでバックエンドエンジニアをやっている永井です。
この記事は、メディア事業部の広告横軸組織[PTA](https://twitter.com/PTA_CyberAgent)の[アドベントカレンダー](https://adventar.org/calendars/7539)5日目の記事となります。

# 概要
会社とは全く関係ないのですが、プライベートで[SPAJAM2022](https://www.spajam.jp/result/)に「お久しぶり!」というチーム名で参加し、ありがたいことに本戦で優秀賞と長崎賞をいただくことができました。ハッカソンという時間が極端に少ない状況において開発中に気をつけたこと、もっとこうしておけばよかったことを述べます。

# ハッカソンとは
念の為ハッカソンについて説明させてください。ハッカソンとは、ハックとマラソンを掛け合わせた言葉です。決められた期間内にテーマに沿ったアプリケーションを開発し、プレゼンして完成度やテーマ性にどれほど沿っているか競い合う競技になっております。今回お話しす

元記事を表示

Goの//lineコメントを君は知っているか?

## コメントディレクティブ

Goには、`//go:noescape`や`//go:linkname`などのコメントでコンパイラへの指示を記述するコメントディレクティブがあります。一応、[ドキュメント](https://pkg.go.dev/cmd/compile#hdr-Compiler_Directives)には記載がありますが、多くのGoエンジニアはあまり機会はないでしょう。

ドキュメントを読むと`//line`で始まるコメントは特別な意味を持つことが分かります。ここではこのlineディレクティブについて解説します。

## lineディレクティブ

ドキュメントには、以下のように記述した場合に、lineディレクティブとして認識されるようです。行コメントだけはなく、ブロックコメントも対象となります。`//`や`/*`の後ろにスペースを含んでは行けなかったり、`:`が必ず含まれていなければならなかったりと、細かなルールがあります。

“`
//line :line
//line :line:col
//line filename:line
//line filename:li

元記事を表示

OTHERカテゴリの最新記事