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

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

Go言語におけるinterfaceって何がええねんって話

# 対象者
– Goのinterfaceでつまづいた人
– interfaceを理解したけれど何が嬉しいのか全くわからない人

# 初めに
 個人的にGoの3大挫折ポイントはゴルーチン,interface,クロージャーであると考えています(自分が苦戦しました)

 そこで今回は主にinterfaceに焦点を絞って自分なりに勉強したことを共有できたらなって思っています

# じゃあなぜ躓くんだ?って話

 これは結論から言うとJavaなどのオブジェクト指向型のプログラミング言語と使い方が少し異なるからです

例えば以下はjavaでのinterfaceの書き方になります

“`java

interface Sports {
public abstract void Dribble();
public abstract boolean Pass(Str x);
public abstract int Shoot(int y);
// …

}
“`

 ここで重要なのはメソッド名はあるけど何するかわからない抽象的なものであると言うことです。

 こ

元記事を表示

【AWS x ECS x Go】New Relic の導入② APMの取得

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

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

本記事は、その取り組みの中で行なった、APMの取得に関する記事になります。

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

# 導入
## 初期化
NewRelicのAPM計測用Goエージェントを初期化する。

まずは、アプリケーションに `github.com/newrelic/go-agent/v3/newrelic`パッケージをインポート
“`golang
import github.com/newrelic/go-agent/v3/newrelic
“`

次にmain関数、またはinitブロックに以下を追加することで、Goエー

元記事を表示

Apache Beam Go SDK で Cloud Pub/Sub のデータを取得する

[QualiArts Advent Calendar 2022](https://qiita.com/advent-calendar/2022/qualiarts) 11日目担当の8kkaです。
本記事では、最近ログフロー構築で使えないかなぁ…と模索している Apache Beam Go SDK について書こうと思います。

# Apache Beam Go SDK
Apache Beam は、バッチやストリーミングでデータ処理を行うための統合プログラミングモデルです。

https://beam.apache.org/

Apache Beam モデルでは、分散処理の細かい設定が抽象化されているため、ユーザーはジョブの実行ロジックに焦点を絞る事ができます。
実行環境もいくつかあり、 直接コンソールから実行する Direct Runner や Apache Spark、Google Cloud Dataflow など、様々な環境で実行できます。

Apahce Beam を利用する際の言語は Java と Python が有名ですが、近年 Go の SDK も充実してきています。

元記事を表示

GoogleからGoのスタイルガイドが公開されたので一部まとめた

# はじめに

この記事はand factory.inc Advent Calendar 2022 10日目の記事です。
数時間の遅刻です。。寝るまでが10日目なのでセーフ!(ではない)

昨日は@yasukotelin さんの「[【Jetpack Compose】Pagerを使った画面でもCollapsing Toolbarを実装したい](https://qiita.com/yasukotelin/items/b8d084ed783f5c698de3)」でした。

こんにちは。
and factory サーバサイドエンジニアのnsym__mです。

先月、Googleから[Goのスタイルガイド](https://google.github.io/styleguide/go/)が公開されました。
これまでGoでのスタイルガイドやコーディング規約としてはまず[Effective Go](https://go.dev/doc/effective_go)が前提にあり、その補足として[Go Code Review Comments](https://github.com/golang/go/w

元記事を表示

Let’s Go “domain primitive” !

# はじめに

この記事は [Go Advent Calendar 2022](https://qiita.com/advent-calendar/2022/go) 11日目の記事です。
Go歴1年半くらいの @takokun778 が執筆します。

# what’s domain primitive ?

タイトルにある`domain primitive`(ドメインプリミティブ)とは以下の特徴を持つものです。

– ドメイン・モデルを構築する最小の要素
– ドメイン・モデルの基礎を形成するもの
– 不変(`immutable`)であり有効となる場合にだけ存在

[セキュア・バイ・デザイン 安全なソフトウェア設計](https://book.mynavi.jp/ec/products/detail/id=124056)という本の第5章ドメインプリミティブで紹介されています。
こちらの本は`Java`を用いて実装例が示されています。

そんな実装をあえて`Go`で書いてみようと思ったのがこの記事の内容となります。
また、本の内容を`Go`で書き換えてみようというよりいろんなところで見聞き

元記事を表示

goでgRPCのAPIを実装する go and Connect

# goでgRPCのAPIを実装する go and Connect

Connectというシンプルでスリムなライブラリを使って、gRPCのAPIサーバを開発してみます。

Connect は、ブラウザーおよび gRPC と互換性のある HTTP API を構築するためのスリムなライブラリです。Protocol Buffer スキーマを使用してサービスを定義すると、Connect がタイプ セーフなサーバー コードとクライアント コードを生成します。サーバーのビジネス ロジックを入力すれば完了です。手書きのマーシャリング、ルーティング、またはクライアント コードは必要ありません。

前提:
go 1.18
buf

プロジェクト作成
“`
$ mkdir connect-go-example
$ cd connect-go-example
“`
initとインストール
“`
go mod init example
go install github.com/bufbuild/buf/cmd/buf@latest
go install github.com/fullstoryd

元記事を表示

Go製プレゼンツール「present」のインストール手順

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

## はじめに

愛用しているGo製プレゼンツール「[present](https://pkg.go.dev/golang.org/x/tools/present)」ですが、毎回インストール手順を忘れてしまっているのでここに記します。(go module 対応してからコマンド一発で起動しなくなったので余計に…)

– [present package – golang.org/x/tools/present – Go Packages](https://pkg.go.dev/golang.org/x/tools/present)

## 作業手順

今回は macOS Ventura 13.0.1 で行っています。

### 事前準備

Go本体のインストールを、お忘れなく!

– [Downloads – The Go Programming Language](https://go.dev/dl/)

元記事を表示

C言語のprintfにGoの%v相当のものが実装できないか実験してみた

# はじめに
@shiozaki さんの投稿された記事『[C言語のprintfにはGoの%v相当のものが存在しない理由](https://qiita.com/shiozaki/items/c72a02ebaddcf854bf9b)』を拝見し、「Cでもそういうことができたら便利になるのかな?」と思い雑に実験してみました。

# 書いてみたコード
`printf`の代わりとなる関数`myprintf`を作成しました。実験用の手抜き実装なので`printf`の機能の多くを含んでおりません。
C11で追加された機能である`_Generic`を使用しています。
“`c:myprintf.h
#ifndef MYPRINTF_H
#define MYPRINTF_H

enum {TypeChr, TypeInt, TypeLng, TypeDbl, TypeStr};
typedef struct {
int t;
union {
char c;
int i;
long l;
double d;
c

元記事を表示

【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 :=

元記事を表示

OTHERカテゴリの最新記事