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

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

Firestore Data Bundlesをサーバーサイドから利用することは可能か?

## はじめに
Firestoreの読み取りコストを削減するための仕組みとして、Firestore Data Bundlesがあります。
基本的にはクライアントのSDK(Webやモバイル)からの利用が想定されていますが、サーバーサイドからも利用することはできないか調査しました。

https://github.com/kawamou/firestore-data-bundles-playground

## 結論

– Firestore Data Bundlesはただの静的ファイルなのでサーバーサイドからも読み取ることは可能
– ただしマッチョな実装になるので少々注意が必要

## Firestore Data Bundlesとは

https://zenn.dev/moga/articles/firestore-data-bundles

[公式ドキュメント](https://firebase.google.com/docs/firestore/bundles)もありますが、上記ブログ記事がとても分かりやすいです。
コードと内容ともかなり参考にさせていただきました。

簡単にま

元記事を表示

【Docker】networksで複数のDocker Compose環境間を通信可能にする

## はじめに
まず今回やりたいことを図で説明するとこんな感じになります。
![sample.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884629/1d488e95-8470-8ea5-3d06-d5b877b59a76.png)

一つのDocker Composeの中であれば、はじめから各コンテナはお互いに通信可能です。

> デフォルトで Compose はアプリに対して1つの ネットワーク を作成します。サービス用の各コンテナはデフォルトのネットワークに接続し、そのネットワーク上で他のコンテナと相互に「 接続可能reachable 」になります。
https://docs.docker.jp/compose/networking.html

しかし複数のDocker Compose間の通信はデフォルトの状態ではできません。
そこで、Docker Composeのネットワーク機能を使って複数のDocker Composeを通信可能にしよう、というのがこの記事の趣旨です。

#

元記事を表示

Go のバージョンを上げたら gRPC のコード差分が出てきた件

## gRPC のコード差分

仕事で Go を使って gRPC の開発をしているとき、 同じ `*.proto` から生成された `*.pb.go` ファイルが人によって差分が生じるという問題が起こりました。

出てくる差分というのは、下記のように整形されていないコメントがあったとき、これから生成される `*.pb.go` 内のコメントが整形されたりされなかったりするというものです。

“`proto:person.proto
syntax = “proto3”;

option go_package = “example.com/person”;

// Person はプロフィールを表すメッセージです。
message Person {
optional string name = 1;
optional int32 id = 2;
optional string email = 3;
}
“`

“`go:ある人の person.pb.go
// Person は人のプロフィールを表します。
type Person struct {
state

元記事を表示

SQLBoilerでテスト用の自作テンプレートを生成する

[Go Advent Calendar](https://qiita.com/advent-calendar/2022/go)の枠が空いていたので参加させていただきました。

# TL; DR

[SQLBoiler](https://github.com/volatiletech/sqlboiler) のテストコードに使用するために [go-mysql-server](https://github.com/dolthub/go-mysql-server) のテーブル定義ファイルを自動生成

– テンプレート: https://github.com/Syuparn/sqlboiler-practice/tree/main/simulator_models
– 利用箇所: https://github.com/Syuparn/sqlboiler-practice/blob/main/test/scenario_test.go

# はじめに

go-mysql-serverを使ってDB周りのテストをせこせこ書いていたとき、ふと思いつきました。
「**スキーマに依存するコードは自動生成でき

元記事を表示

C言語のprintfにはGoの%v相当のものが存在しない理由

Go言語のPrintf関数は `%d` や `%s` などのフォーマット指定を使って第二引数以降の値を埋め込んだ文字列を出力します。
また、 `%v` というどんな型に対してもいい感じに出力してくれる万能なフォーマット指定子もあります。
このPrintf関数はC言語のprintf関数が元になっていますが、元ネタのprintfには `%v` という便利なフォーマット指定子がなく、型の種類毎に別々のものを使う必要があります。
なぜ、C言語には `%v` 相当のものが存在しないのでしょうか?

# 答え
Goのinterface{}は元の型情報を保持しているが、C言語のva_listは元の型情報を保持していないため。

まず、GoのPrintfのシグネチャを確認します。
以下によると、`func Printf(format string, a …any) (n int, err error)`というシグネチャであることが分かります。

https://pkg.go.dev/fmt#Printf

第二引数以降はany型という型で受け取っています。
このany型はinterface{}型と

元記事を表示

Goでスタックトレースを実装

# スタックトレースとは
実行中のプログラムがエラーを起こした際に、その直前まで実行していた関数やメソッドの履歴を表示すること。

インタプリタ型言語の実行環境では準備されていて、デバッグ時にエラーを出した際にはスタックトレースが見られることが多い。

サーバーサイドのデバッグにはこのスタックトレースがあるかないかで作業効率に天と地ほどの差を生む(と考えている)ので
この記事ではGoでのスタックトレースの実装方法を紹介する。

# Goでの実装
環境: go1.17.10

使用するパッケージ
https://pkg.go.dev/runtime

“`go:main.go
package main

import (
“runtime”
“fmt”
)

func showStackTrace() {
i := 0
for {
pt, file, line, ok := runtime.Caller(i)
if !ok {
break
}
funcName :=

元記事を表示

AWS App Meshを使ったABテスト環境の構築

# 概要
サイト内検索の読者体験を向上させるため、社内でABテスト環境を構築しました。
社内では現在マイクロサービスアーキテクチャを採用しており、サービスメッシュでAWS App Meshを利用しています。
この記事ではAWS App Meshだとこういった方法でABテストができる、という知見をまとめます。

# 実現したかったこと
– 読者体験の向上を目指したかったので行動データを元に検索エンジンやチューニングを比較したい
– トレンド性のあるサービスなので、同時に比較したい
– UIのABテストでFirebase RemoteConfigを利用しているので同じツールでテストをし、既存のアクセス解析ツールで分析したい

# ハイレベルアーキテクチャ
Control PlaneのAB Testing Controllerでは、データアナリストやPOなどの人がABテストの設定を行います。
これはどういった人にどの程度AとBをそれぞれ公開するのか、制御するための設定です。
Client Applicationはその割り当てられた情報をエンコードしてリクエストヘッダに付与してAB Testi

元記事を表示

キューイング処理をRedisからAzure Service Busに移行した話

## はじめに

この記事はKLab 2022 Advent Calendarの9日目になります。

社内ツールで実装されていたキューイング処理を、Redisから[Azure Service Bus](https://learn.microsoft.com/ja-jp/azure/service-bus-messaging/service-bus-messaging-overview)に移行した際の知見を共有する目的で記事を作成しました。
あまり深く踏み込んだ話はないですが、キューイングサービスもしくはミドルウェアを比較検討する際などに参考にしていただければ幸いです。

https://learn.microsoft.com/ja-jp/azure/service-bus-messaging/service-bus-messaging-overview

## Redisでキューイング処理を行う際の問題点

Redisでメッセージを格納する簡易的なキューを実装する場合、[Lists型](https://redis.io/docs/data-types/lists/)を用いて作成できます

元記事を表示

C#で書いたライブラリをPHPやGoから呼び出す

本記事は [サムザップ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/sumzap) の12/9の記事です。

.NET 7より、ソースコードを中間言語(CIL)ではなく、ネイティブコードへコンパイルするNative AOTがサポートされました。
そのNative AOTに関連して、.NET系言語**以外**からも呼び出し可能な[ネイティブライブラリが作成できる](https://learn.microsoft.com/ja-jp/dotnet/core/deploying/native-aot/#build-native-libraries)ようになっています。
他言語から.NETの、例えばC#で書いたライブラリを利用できるというのは魅力的ですので、早速試してみました。

## C#でネイティブライブラリを作成する

まずはC#のクラスライブラリプロジェクトを作成します。

“`shell-session
$ dotnet new classlib -o NativeLibrary
“`

作成されたプロ

元記事を表示

Go/gin HTMLテンプレートの使い方

gin勉強の備忘録

最終更新:2022/12/09

***multitemplateのインストール***
“`
go get github.com/gin-contrib/multitemplate
“`

“`:ファイルパス
Project名
├── main.go
└── views
├── templates
│ ├── template.tpl
└── index
├── index1.tpl
└── index2.tpl
“`

***render.AddFromFiles(name string, …filename string)
第一引数”name”をctx.HTML(http.statusOK, “\*\*\*\*\*”, gin.H{})の”\*\*\*\*\*”に入れる***

“`go:main.go
package controller

import (
“net/http”

“github.c

元記事を表示

Goの比較可能性(comparable)

## はじめに

どうも[ナレッジワーク](https://tenn.in/kw)の[tenntenn](https://tenn.in)です。

さっき、次のような記事を書いたんですが、そもそも比較可能性について、あまり知られてなさそうということでまとめることにしました。

https://qiita.com/tenntenn/items/b33e799567a94928a663

## 比較可能性(comparable)

Goには比較可能な型と比較できない型があります。たとえば、`int`型や`string`型は比較できますが、スライスや関数は比較ができません。

[言語仕様](https://go.dev/ref/spec#Comparison_operators)には、真偽値、整数値、浮動小数点値、複素数値、文字列、ポインタ、チャネル、インタフェース、構造体(条件あり)、配列(条件あり)が比較可能としています。

比較可能の場合、`==`演算子および`!=`演算子で比較できます。順序付け可能な場合は、さらに`<`、`<=`、`>`、`>=`演算子が使用できます。`int`型な

元記事を表示

Go1.20でcomparable制約はどう変わるのか?

## はじめに

どうも[ナレッジワーク](https://tenn.in/kw)の[tenntenn](https://tenn.in)です。

Goには、1.18でジェネリクス(型パラメータ)が導入されました。ジェネリクスの導入と共に、インタフェースを型パラメタに対する型制約として利用し、新しく型セットという概念が入りました。

型制約はインタフェースとして宣言可能ですが、『比較可能な型』のような制約のもつ型セットが無限集合になる、かつ現時点でのインタフェースでの表現では難しい制約を組み込みで提供することで解決しています。

たとえば、『比較可能な型』を表現する制約として`comparable`が導入されました。ここでは、Go1.18で提供された`comparable`についてと、それがGo1.20でどう変わるのかを解説します。

なお、本記事で扱う内容は、Go1.20でリリースとしていますが、今後の変更によっては変わる可能性があります。しかし、すでに変更はRC1版としてリリースされているため、入る可能性は高いでしょう。

## Go1.18で導入されたcomparableとは?

元記事を表示

Go言語でスライスから特定の要素を削除する方法

# 概要

Go言語でスライスから特定の要素を消す方法がわからなかったので調べてみました。
スライスには削除の関数のようなものがないため、`append`や`copy`などの関数を使用してスライスを操作して最終的に削除を実現していく必要があります

# ハマったポイント

Goのスライスの要素を確認して、もしも消したい文字列と一致する要素があれば削除したいなと思う処理がありました。
例えば商品のJANコードなどの、string型の識別子で判定して該当の商品を削除した位ケースなどです。

Rubyであれば、そのような文字列判定での配列の削除は`delete`メソッドなどを使って下記のように実行できます。

“`ruby
array = [“apple”, “grape”, “orange”]
# => [“apple”, “grape”, “orange”]
array.delete(“grape”)
# => “grape”
array
# => [“apple”, “orange”]
“`

Goでも同じことをやりたいと思ったのですがどうすればよいかわかりませんでした。

# G

元記事を表示

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

元記事を表示

OTHERカテゴリの最新記事