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

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

GoでDockerコンテナを起動・停止

参考

https://pkg.go.dev/github.com/ph/moby/client

https://future-architect.github.io/articles/20210427b/

## Goに入門してみた

最近Goに入門したのと,Dockerの本格的な利用が時々あるので両方勉強するためにDocker関連のWebアプリケーションをGoで実装してみることになったのでメモを残しておきます.

## Goでdocker ps

以下が`docker ps`コマンドの実行プログラムになります.

“`go
package main

import (
“context”
“fmt”
“github.com/docker/docker/api/types”
“github.com/docker/docker/client”
)

func main() {
ctx := context.Background()
cli, err := client.NewEnvCli

元記事を表示

golangでバージョン情報をいい感じに表示する方法

## やりたいこと
float64の値を下記ルールで表示したい
– 小数なら、0埋めせずそのまま表示したい
– ex)1.1→1.1,1.110→1.11
– 整数なら`.0`をつけたい
– ex)1→1.0,2→2.0

### 補足
DB上には、demical(3,2)みたいな形式で保存されているバージョン情報を画面上とかに表示するときにどうするか、みたいなシチュエーションです。
そもそもvarcharで保存しておけば良いんじゃ…?と思った方、それはそう。

## 答え
“`example.go
func floatFormat(f float64) string {
// 整数かどうか
if math.Floor(f) == f {
return strconv.FormatFloat(f, ‘f’, 1, 64)
}

return fmt.Sprintf(“%v”, f)
}

“`
あんまりスタイリッシュじゃないので、どなたか良い案あれば教えて下さい。

## 参考
https://tyablog.net/2021/03/28/gol

元記事を表示

Swaggoはじめてみました

業務委託で参画しているプロジェクトで、「API設計書を書く時間がないけど欲しい」ので`swagger`を導入してみました!
フレームワークの種類が豊富な`swaggo/swag`を採用し現状かなり満足しています。
この記事では、`swagger`の導入を検討している人向けに解説していきます。

# 前提
– Go v1.19
– `github.com/swaggo/swag@v1.8.7`
– `github.com/swaggo/swag/cmd/swag@v1.8.7`
– `github.com/labstack/echo@v4.9.1`

# 使い方
基本的にswagger用のアノテーションやタグを書いて、`swag init`を通すだけです。

## 導入
swaggoのバージョン(`ex. v1.8.8`)だと、`gofmt`とコンフリクトするので下記のバージョンを使っています。

“`bash
$ go install github.com/swaggo/swag/cmd/swag@v1.8.7
“`

### 1. mainパッケージの記述
e

元記事を表示

Goで書かれたアプリケーションをGithub ActionsでCIする

# Github Actionsとは

メタップスアドベントカレンダー8日目の記事です。

私が携わっているプロジェクトでは、CIツールとしてGithub Actionsを利用しています。Github Actionsでは、Jobと呼ばれる小さな単位を組み合わせて、一連の自動化処理であるWorkflowを作成します。Workflowはリモート・リポジトリへのプッシュやプルリクエスト作成をトリガーとして起動します(cronのような書式設定で定期実行もできるようです)。Jobの処理順序や、起動トリガーはYAMLファイルで定義し、所定のディレクトリ(`.github/workflows`)へ設置します。1つのリポジトリには複数のWorkflowを定義可能です。本記事では、プログラミング言語Goのプロジェクトで、ビルドやテストをGithub Actionsを使って自動化してみたので解説を行います。

# 設定ファイルの記述

プロジェクトで使っている設定ファイルを下記に示します。こちらを適当な名前で保存し、 `.github/workflows` へ保存してpushを行うと、設定に従って処理が行

元記事を表示

正規表現の例として、WebAssemblyとGopherJSを比較する

この記事は [Wano Group Advent Calendar 2022](https://qiita.com/advent-calendar/2022/wano-group) の8日目の記事です。

## 概要

GoをWebブラウザ上で動作させるために、色々な方法やツールはありますが、今回は正規表現のパターン判断を作るの例として、WebAssemblyとGopherJS二つのやり方で紹介と比較したいと思います。

## WebAssemblyとGopherJS

– WebAssembly(略称Wasm)は、Webブラウザを含むモダンな実行環境での効率的なコード実行ために、アセンブリ言語ライクなテキスト形式で設計された低レベルフォーマットだ。GO言語使いたい場合、公式のリポジトリからwasmファイルをロードするツール(wasm_exec.js)を提供します
– https://github.com/golang/go/tree/master/misc/wasm

– 一方、GopherJSはGoのコードをJavaScriptに変換するライブラリです。そのほか、コンパ

元記事を表示

Docker + gorm + gin で入れ子構造のAPIを作る

# はじめに
STECH / 愛知工業大学 システム工学研究会 共同企画 Advent Calendar 2022 の8日目の記事を書かせていただきます水谷です!
あるイベントでGoとmySQLとDockerでAPIサーバを作ったのでその時のことをまとめました。
もしおかしな点があったら指摘していただけると助かります!

# ファイル構成

“`
${ROOT}
├── docker
│   ├── go
│   │   └── Dockerfile
│   └── mysql
│   ├── Dockerfile
│   ├── init
│   │   ├── 1-area.sql
│   │   └── 2-institution.sql
│   └── mysqld_charset.cnf
├── docker-compose.yml
├── go
│   ├── cmd
│   │   └── main.go
│   ├── controller
│   │   ├── area_controller.go
│   │   └── i

元記事を表示

go言語(echo)APIサーバーの構築手順(+reactとの接続設定手順)

# 概要
dockerを使用してGo言語でJSONを返すAPIサーバーを構築
(+ローカルで起動させたreactからAPIを呼び出しJSONを受け取る)

※dockerとgolangの動作環境が準備済みである事、reactの環境構築については割愛する

# 目次
[1. dockerコンテナとgo言語環境ソースファイルのファイル構成](#1-dockerコンテナとgo言語環境ソースファイルのファイル構成)
[2. dockerコンテナの準備](#2-dockerコンテナの準備)
[3. APIサーバーの構築](#3-apiサーバーの構築)
[4. react側の記述](#4-react側の記述)

# 1. dockerコンテナとgo言語環境ソースファイルのファイル構成

go言語の環境構築については下記記事参照
[windowsでGo言語を使ったWEBアプリケーション作成の環境を構築する](https://qiita.com/kubota_ndatacom/items/84e98d84e5859d602102)

“`ファイル構成
docker
+—golang-api

元記事を表示

Docker + gorm + gin で入れ子構造のAPIを作る

# はじめに
STECH / 愛知工業大学 システム工学研究会 共同企画 Advent Calendar 2022 の8日目の記事を書かせていただきます水谷です!
あるイベントでGoとmySQLとDockerでAPIサーバを作ったのでその時のことをまとめました。
もしおかしな点があったら指摘していただけると助かります!

# ファイル構成

“`
${ROOT}
├── docker
│   ├── go
│   │   └── Dockerfile
│   └── mysql
│   ├── Dockerfile
│   ├── init
│   │   ├── 1-area.sql
│   │   └── 2-institution.sql
│   └── mysqld_charset.cnf
├── docker-compose.yml
├── go
│   ├── cmd
│   │   └── main.go
│   ├── controller
│   │   ├── area_controller.go
│   │   └── i

元記事を表示

【簡単】AWS Cloud9でGo言語(Golang)を使用できる様にするまで

## はじめに
今回は、初めてCloud9を使用してGolangを触りたいという人向けに作成した記事になります。

:::note warn
注意点
こちらの記事には一部金銭が発生する可能性のあるサービスを使用しております。
今回の記事の内容のみであればAWSの無料枠内で収まりますが、他のサービスを知らずに使用していると金銭が発生する可能性があります。
もし絶対にお金をかけたくないという方は本記事を読むのをやめることをおすすめいたします。
:::

| 目次 |
|:————-|
| [1. AWSのアカウント作成](#1-awsのアカウント作成) |
| [2. Cloud9の環境構築](#2-cloud9を使用してコードを記述できる環境の作成する) |
| [3. GolangをCloud9で使用できる様にする](#3-golangをcloud9で使用できる様にする) |

この3部構成で記事は作成されております。

## 1. AWSのアカウント作成
まず初めに

元記事を表示

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

元記事を表示

OTHERカテゴリの最新記事