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

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

【Go/並行処理】Futureパターンってなにか調べてみた!

## はじめに

こんにちは![@uh-zz](https://twitter.com/_uhzz_)です!

この記事は、[Go Advent Calendar 2022](https://qiita.com/advent-calendar/2022/go)の 10 日目の記事になります!

今年は、個人的に色々なことに挑戦した年だったなあと振り返るとともに、去年のアドベントカレンダーからもう1年経つのか〜という気持ちです

https://qiita.com/uh-zz/items/7485de5d0658492c86eb

(去年もパターンについて書いてました笑)

この記事では、Go における Future パターンの紹介と使わている OSS を見ていきたいと思います

## いったんCM

社のアドベントカレンダーも絶賛開催中です!

https://adventar.org/calendars/7407

## 想定読者

– Go でプログラミングを始めた人
– ゴリゴリ Go を書いている人
– 他言語で並行プログラミングしてる人

## Future パターンとは

元記事を表示

【AWS x ECS x Go】New Relic の導入① ログ設定とメトリクスの収集

# はじめに
こんにちは、[rendaman0215](https://twitter.com/rendaman0215)です。

弊社では、ログ保管やAPM・メトリクスの収集先としてNewRelicを採用しています。
私は認証チームとして、Go言語のサービスにNewRelicを導入したため、その方法を紹介できればと思います。

本記事は、その取り組みの中で行なったログ転送とメトリクス収集に関する記事になります。

# 実施環境
言語:Go言語
フレームワーク:[go-chi](https://github.com/go-chi/chi)
実行環境:ECS on Fargate
CI/CD: Codeシリーズ

# 導入
## ログ転送
ログをあらかじめjsonにシリアライズしておく必要はありますが、タスク定義に以下の設定を組み込むことですぐ使用開始できます。
タスク定義上のアプリケーションコンテナ部分に以下のように書きます。
これらの設定をすることで、firelensでログを飛ばす設定ができます。
“`json
“logConfiguration”: {
“logDriver”

元記事を表示

Goでハッシュテーブルを自作してみる

以下参考リンクにあるシリコンバレーエンジニアエンジニア酒井潤さんのUdemy講座をもとに、Go言語でハッシュテーブルを作成してみました。
参考:https://www.udemy.com/course/python-algo/
*講座ではPythonが用いられています

“`go:main.go
package main

import (
“crypto/sha256”
“fmt”
“strconv”
)

type HashTable struct {
size int
table [][]*Data
}

type Data struct {
key string
value string
}

func NewHashTable(size int) *HashTable {
return &HashTable{
size: size,
table: make([][]*Data, size),
}
}

func (h *HashTable) hash(key string) (int, error) {
b := sha256.Sum22

元記事を表示

go言語(echo)を使って簡単なWEBページを作成する手順

# 概要
Go言語を使って簡単なWEBページを作成する

※dockerとgolangの動作環境が準備済みである事

# 目次
[1. dockerコンテナとgo言語環境ソースファイルのファイル構成](#1-dockerコンテナとgo言語環境ソースファイルのファイル構成)
[2. WEBサーバー構築](#2-webサーバー構築)
[3. htmlファイルの作成](#3-htmlファイルの作成)

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

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

“`ファイル構成
docker
+—web-app
| docker-compose.yml
+—images
+—golang-api
DockerFile
go
+—web-app

元記事を表示

VScodeでGoのデバッグを行う際にエラーが発生した

## 概要
起動したいファイルを指定してVScodeからデバッグを実行すると以下のエラーが発生した。

“`terminal
Failed to launch: could not launch process: can not run under Rosetta, check that the installed build of Go is right for your CPU architecture
“`

備忘録として解決方法を投稿する。

## 環境
■ PC
macOS Monterey
バージョン 12.5.1
■ チップ
Apple M1 Pro
■ CPUアーキテクチャ
“`
e2e % uname -m
arm64
“`

## 原因
自身のPCのCPUアーキテクチャが`arm64`にも関わらず、[Goの公式](https://go.dev/dl/)よりインストールしたファイルが`amd64`であっためエラーになっていた。

“`
Go version
go version go1.19.3 darwin/amd64
“`

よって、現在のGoを削除し

元記事を表示

GitHubのサイトを指定したGo Installのやり方に手間取ったのでメモ

# まえがき
Goでプログラミングをしてみたいと思い、環境整備したときモジュールのインストールにかなり手間取った。
その時の忘備録。
GitHub以外のリポジトリからインストールするときはまた話が変わってくるので注意。

# 環境
OS:Windows 10(64bit)
プロセッサ:AMD Ryzen 5 3450U with Radeon Vega Mobile Gfx 2.10 GHz
RAM:16 GB
Goのバージョン:go1.19.3 windows/amd64

# 結論
こうすればOK。
“`:書き方
go install github.com/<リポジトリのパス>@HEAD
“`

# 経緯
Teftifyをインストールしたいと思い、公式のインストール方法を見てみた。

https://github.com/stretchr/testify#installation

“`:サイトに書いてあったやり方
go get github.com/stretchr/testify
“`
なんだこれなら簡単じゃないか、と思いきや、以下のエラーが出てしまった。
`

元記事を表示

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

元記事を表示

OTHERカテゴリの最新記事