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

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

Dapr go-sdkのactor clientはどのようにリクエストを行っているのか

# TL; DR

– go-sdkのactor client作成時にgRPCリクエスト実装は不要
– ユーザーが指定するのは関数フィールドの定義のみ
– `client.ImplActorClientStub` が `reflect` を使って動的に関数生成

# はじめに

Daprのactorを使ってみようとgo-sdkのサンプル実装を見ていたところ、クライアント側にgRPCリクエスト処理が見当たりませんでした。

https://github.com/dapr/go-sdk/blob/b465b1fa07211ee8a43bdd66906423d2e9e14ebd/examples/actor/api/actor.go

“`go:examples/actor/client/main.go
// actorのメソッドGetUserを呼び出し。この実装はどこにある?
user, err := myActor.GetUser(ctx, &api.User{
Name: “abc”,
Age: 123,
})
“`

メソッドを追いかけようとするも、実態はフィールドで定義が

元記事を表示

AWS SAMでGo+API Gateway+Lambda+DynamoDBのサーバレスAPI構築をIaC化した

# はじめに
前回Goで作成したAPIの環境構築をSAMでIaC化しました。

https://qiita.com/tkhs1121/items/7b193dcce19539f16761

# 環境
MacBook Air M1
開発言語 Go

# 手順

AWS CLIとSAM CLIをインストールします。

“`shell
brew install awscli
brew tap aws/tap
brew install aws-sam-cli
“`

AWSコンソールのIAMからアクセスキーを作成して、クレデンシャルを設定します。

“`shell
aws configure
“`

前回のソースディレクトリにSAMの`template.yaml`を追加します。

https://github.com/tkhs1121/go-serverless-app-3

## ソースコード
“`yaml:template.yaml
AWSTemplateFormatVersion: ‘2010-09-09’
Transform: AWS::Serverless-2016-10-

元記事を表示

ローカルのGoのバージョンアップはめちゃ簡単な話

# 前提
Macでしか試していません。
古いバージョンのGoは、Go公式からダウンロードしてインストールした場合。

# バージョンアップ方法
[Goの公式サイト](https://go.dev/doc/install)でDownloadボタンを押して、インストールを進めるだけです。

既にGoがインストール済みの場合は以下のポップアップがでます。OKを押すだけで古いバージョンを削除したうえで、新しいバージョンをインストールしてくれます。
![Goのインストール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221948/040cb241-bcc1-ebf5-531d-d2d786461f27.png)

自分で古いGoをアンインストールする手間もないので、めちゃ楽ですね!

元記事を表示

【Go】並列実行の勉強がてらスリープソートを書いてみよう

# まえがき
ゴルーチン、まるで分らない…Fuseです
そんな悩みを解決しようと並列実行が使えそうなものを考えてはみたもののなかなか思いつかない、
そんな中、Wikipediaを漁っていたら…
>バケットソートのバケツをメモリ空間の代わりに時間に置き換えたもので、もともと掲示板4chanに投稿されたアイデアである。
>「全要素の最大値×スリープさせる単位時間」で実際にソートできてしまう。それが役に立つ事例は例題程度であろう。

[バケットソート/スリープソート](https://ja.m.wikipedia.org/wiki/%E3%83%90%E3%82%B1%E3%83%83%E3%83%88%E3%82%BD%E3%83%BC%E3%83%88#.E3.82.B9.E3.83.AA.E3.83.BC.E3.83.97.E3.82.BD.E3.83.BC.E3.83.88)より引用
### これだッ!!
というわけで作ってみました。
## 完成品

## ソースコード
https://github.co

元記事を表示

Goのmoduleのtidyに失敗した時の話

`go mod tidy` をローカルで実行してモジュールのお掃除をしようとしたところ、以下のエラーになりました。

“`
% go mod tidy
go: go.mod file indicates go 1.19, but maximum version supported by tidy is 1.18
“`

英語弱者の私は、「 `go mod tidy` は廃止されたのかー。この間できたばかりの機能だったのになー。」などと勘違いしてしまいした。
違います。
原因は `go.mod` に記載のGoのバージョンよりもローカルのGoのバージョンが古いだけでした。
ローカルのGoのバージョンを1.19にしてエラーがでなくなりました!

記事にするほどの内容でもないですが、念の為、備忘録として残しておきます。

元記事を表示

インタープリター版Go言語、gomacroを触ってみた

# はじめに

Go言語のインタープリターを探していたところ、gomacroという処理系を見つけました。

https://github.com/cosmos72/gomacro

独自機能も多く、処理系を超えて「Go言語の方言」になっていると感じたので、本記事ではgomacroの機能について紹介したいと思います[^intro]。

以下は記事執筆時点でのmasterブランチを使用しています。

# REPL

PythonやRuby等のような、対話的にコードを実行できるモードがあります。1行おきに式がそのまま評価されます。

“`
// Welcome to gomacro. Type :help for help, :copy for copyright and license.
// This is free software with ABSOLUTELY NO WARRANTY.
gomacro> 6 * 7
{int 42} // untyped.Lit
“`

もちろんprintも可能です。ちゃんと戻り値も全て表示されます。

“`
gomacro>

元記事を表示

【Go】middleware からハンドラ関数に値を渡すときに用いるcontext

# はじめに

Goで middleware からハンドラ関数に値を渡したい場合,contextを使って以下のように書くことが多いと思います.
“`go:middleware内
import (
“context”
“net/http”
)

func exampleMiddleware(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
ctx := context.WithValue(r.Context(), “hoge”, hoge)
next.ServeHTTP(w, r.WithContext(ctx))
}
}
“`

“`go:ハンドラ関数

func exampleHandlerFunc(w http.ResponseWriter, r *http.Request) {
v := (r.Context()).Value(“hoge”)
hoge, ok

元記事を表示

Goの開発環境をMac上でDockerで構築する

#### 今回の目的
今回はGoの開発環境をM1 Macbook pro上にRancher desktopを利用してコンテナ環境を構築します。そこで[Tour of Go](https://go-tour-jp.appspot.com/list)の環境を実行します。
オンラインでもできますが、せっかくなので写経的な形で進めるためにGoの環境を用意します。多少環境祭などもでてくるでしょうが細かいことは気にせずにやっていきます。
kubernetesとかを仕事で使っているのですが、Goで作成されている製品なのでGo言語自体の学習もしたいなと思った次第です。

#### 環境
“`
M1 Macbook pro: macOS Ventura 13.0.1
Rancher desktop v1.7.0
コンテナイメージ: Ubuntu20.04
Go: v1.19.4
“`

Rancher desktopはDocker desktopと同じような製品ですが、CRIにdockerとcontainerd選ぶのを選べたりkubernetesのバージョンアップ検証ができたりと便利な製品となっ

元記事を表示

Goで何を実装してるか

## 概要
現在自分が開発しているプロダクトでは、メインの言語にGoを採用している
なぜGoを選定して、Goで何を開発しているかを書く

## API
他の言語でも問題ない部分ではあるが、GoでAPIを書く上で特に困っている点はない
フレームワークにGinを採用したが、標準パッケージだけでも問題なく実装できる

https://gin-gonic.com/

Swaggerドキュメントが生成できて、Swagger UIも使えるのでswagは便利

https://github.com/swaggo/swag

## CLI
Cobraがめちゃくちゃ便利
クロスコンパイルもできるので、今のところGoがCLIを作るのに一番快適

https://cobra.dev/

## Kubernetesのカスタムコントローラー
これがGoを選定した最も大きい要素
Kubernetesのカスタムコントローラーを実装するなら基本的にはGoを選定することになると思う
フレームワークとしてkubebuilderを使用している

https://book.kubebuilder.io/

元記事を表示

go + Echo + gormでtodo Webアプリを最速で作ってみた

# go + Echo + gormでtodo Webアプリを最速で作ってみた

go + ginを使いまわしてEchoでTodoアプリを作ってみました。

環境:Macbook + Goland

#機能概要
* todoリスト
* todo作成
* todo更新
* todo削除

# Echoのインストール
[Echoの公式サイト](https://echo.labstack.com/)

“`go get github.com/labstack/echo/v4“`

## その他ライブラリのインストール
### GORM:O/Rマッパー
[gormの公式サイト](https://gorm.io/ja_JP/)
* gormのインストール
“`go get -u gorm.io/gorm“`
* gorm sqliteドライバのインストール
“`go get -u gorm.io/driver/sqlite“`

### configライブラリのインストール
“`go get gopkg.in/ini.v1“`

### todoアプリの開発
#### ディレクト

元記事を表示

ZOZOTOWNのマイクロサービス開発でバックエンドエンジニアとして学んだことをまとめます

# はじめに
ZOZOTOWNのシステムリプレイスプロジェクトにおいて、API GatewayやID基盤、会員基盤のマイクロサービス開発をバックエンドエンジニアとして2020年から約2年経験しました。その経験の中で私が技術的に学んだTipsをまとめます。なお、開発言語はGoですがGoに限らない内容も含まれます。

# Go言語が関連すること
## エラー系
### wrap
Go1.13以降、errorsパッケージでエラーのwrapができるようになりました。wrapすることで元のエラーを保持したまま返すことができます。%w記法でエラーをwrapします。

“`go
return xerrors.Errorf(“%w”, ErrMemberNotExists)
“`

wrapの使いどきですが、エラーをハンドリングする箇所で、元のエラーに対してerrors.Isやerrors.Asメソッドを実行する場合はwrapします。それ以外ではwrapする必要がないため、代わりに%vを使います。

### xerrors
xerrorsを使うとエラー発生箇所の追跡がしやすくなります。具体的には

元記事を表示

GORMのアソシエーションの自動更新で削除した関連が復活していた

# 起きたこと
GORM(v1.9.16)を使っていて、アソシエーションの削除がうまくいかなかったときにハマったのでその時の調査メモです。
Productモデルと、そこに紐づくShopモデルを並行して更新するようなプログラムを作成していました。

“`go:main.go
package main

import (
“github.com/my-best/products.my-best.com/go/internal/models”
“golang.org/x/sync/errgroup”
)

func main() error {
var product models.Product
eg := errgroup.Group{}
eg.Go(func() error { return updateProduct(&product) })
eg.Go(func() error { return updateProductShop(&product})
// 略
}
“`

`updateProductShop`の内部では不要になっ

元記事を表示

ソースコードgrep地獄を助けるSourceGraph

# はじめに
コードを書いている時間と比較して、コードを「理解している」時間はどれくらいかかるのでしょうか?
[Software社が自社サービスのユーザ約25万人から集計した結果](https://www.software.com/reports/code-time-report)からは、以下のようになっていました。
* **コードを書いている時間:56%** (1日あたり平均52分)
* **コードを「理解している」時間:44%** (1日あたり平均41分)

コードを「理解している」時間はコードを書いている時間に匹敵するほどになっていることがわかります。
このコードを「理解している」時間は、具体的には次のようなものがあります。
* コードを表示して「読んでいる」時間
* プルリクのレビューをしている時間
* コードの理解のためにドキュメントを読んでいる時間

今回は上記のうち**コードを表示して「読んでいる」時間**を効率化できないか考えてみます。

# コードを「読んでいる」時間について
コードを「読んでいる」時間のよくあるケースとして、コード変更前の下調べ作業があります。
以降

元記事を表示

M1 Mac において Go のリモートデバッグができない問題を解決し原因を考察した

本記事は HRBrain Advent Calendar 2022 の25日目の記事です。

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

# はじめに

こんにちは。今年の11月から HRBrain のエンジニアとして働いている清水です。
本記事では、特定のプロダクトの開発環境で起こっていた、M1 Mac において Go のリモートデバッグができない問題を解決し原因を考察しました。

### 対象読者

– M1 Mac において Go のリモートデバッグができない方
– Go のデバッグや Tilt について理解を深めたい方

上記のような方に読んでいただけると嬉しいです!

### 開発環境

– macOS 12.6
– チップ Apple M1
– Go 1.18.4
– Tilt 0.30.10
– Docker 4.13.1

HRBrain では [Tilt](https://tilt.dev/) を使って、マイクロサービスをローカルの開発環境に構築しています。
開発環境や Tilt の詳細については、弊社のテックブログ

元記事を表示

2022年の振り返り

この記事は筆者の[ソロ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/panda) 25日目の記事です。最後の記事になりますので2022年の振り返り的なものをして本年を締めようかと思います。

:::note warn
本記事は筆者が思ったことを雑に書き連ねるポエムです。間違ったこととかそれおかしいやろみたいなことがあるかもしれませんがその際はコメントください。
:::

# 2022年開始時のスキル感
一応今年始まったくらいでのスキルセット的なものを箇条書き
– Java(母国語) 1年半くらいSpringで開発してた
– Ruby ポートフォリオ作るのに書いてたけどもはや書けないレベル
– JavaScript Springで管理画面全部作る時のJQueryとReactも書いてたけど2022年時点ではだいぶ古い書き方してたと思う。つまりほぼ素人
– AWS 管理画面ポチポチ。RDS, EC2, lambda, S3あたりを触ったことある程度。つまり雰囲気

# 2022年触ってきた技術

## Kotli

元記事を表示

gocsvですべてのセルをダブルクォーテーションで囲む

# 概要
gocsvで生成するCSVのすべてのセルをダブルクォーテーションで囲みたかった。
[ネットで見つけた記事](https://qiita.com/developer-kikikaikai/items/af278f52cb06cc0f430d)とは別パターンの実装をしてみた。

# 実装

## 方針
ネットで見つけた記事では、生成したCSVをデコードして、各セルをダブルクォーテーションで囲った後、もう一度エンコードしている。

自分は、以下の方法で実装してみた。
gocsvでは、デフォルトでは内部でencoding/csvのWriter構造体を使用している。そこで、
1. gocsvのCSVWriterインターフェイスを実装する構造体を作成する
2. ↑で作成した構造体に、encoding/csvのWriterの実装を参考に、すべてのセルをダブルクォーテーションで囲むWriteメソッドを生やす
3. ↑をgocsvのMarshalCSVメソッドに渡す

### [gocsvのCSVWriterインターフェイス](https://github.com/gocarina/gocsv

元記事を表示

Amazon EventBridge API Destinationを使って外部API呼び出しを非同期的かつレートリミット内に収まるように行う(Slackで実装)

この記事は[PTAのアドベントカレンダー](https://adventar.org/calendars/7539)24日目の記事です。

# 概要
– [EventBridgeのAPI Destination](https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-api-destinations.html)という機能を使うと、外部API呼び出しを非同期的に実行できる。
– APIのレートリミット内に収まるように自動的に調整してくれる。
– SlackのAPIで実験してみました。

# EventBridge API Destinationとは
EventBridge API Destinationは、EventBridgeのターゲットにHTTP APIの呼び出しを指定できる機能です。

以下の特徴があります。
1. 自動リトライ
1. DLQにも対応
1. 3種類の認証方式に対応
1. APIのレートリミット内に収まるように自動的に調整

# 実装
## 全体像

今回は実験のために以下を実装します。
<

元記事を表示

go にも decltype が欲しいよ、と思った話。

# これは何?

go を書いていて、初めて decltype ほしいよと真剣に思ったので、その記録。

decltype ってのは、C++ にある言語要素で、式からその式の型を得る機能。

“`c++:c++
using usec_t = decltype (timeval{}.tv_usec);
“`

のようにすると、`usec_t` を 構造体 `timeval` のメンバ `tv_usec` の型にすることができる。便利。

そして。

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

にも参加しています。

# ほしいよと思った経緯。

## `unix.Timeval` を使いたい

go で `unix.Timeval` を使おうと思った。
まあ使おうと思った時点で負けという気もちょっとするけど、まあ使おうと思った。

`float64` の値をゴニョゴニョして作った値で `unix.Timeval` を初期化したい。

`unix.Timeval` は、 `Sec` と `Usec` というメンバを持っていてこれに値を入れたい。

元記事を表示

GoのDependency Injectionライブラリ(uber-go/dig, google/wire)を調査した話

# はじめに

普段Java、Spring Frameworkを使って開発していると、Goで開発する場合の依存解決には苦労することがあるように思います。

Dependency Injection(以下DI)をやるとして、階層の深い依存関係のある構造体を初期化しようとすると、あれもこれもとコンストラクタを呼ぶことになります。また、往々にしてそういった構造体は1つではないので、どでかい初期化処理が生まれることになります。

そこで、本記事では、GoにいくつかあるDependency Injectionをサポートするライブラリについて調べていきます。

## Goの依存解決の課題は何か

作成するアプリケーションや、開発体制が大きくなればなるほど、以下のような課題が出てきます。

1. コンストラクタをたくさん呼び出して、やっとこさ初期化できるインスタンス
2. 初期化の定義が大集合しがち。複数人が同じファイルをあれやこれやと編集することになる。
3. 構造体が実装しているインタフェースを明示的に記載しないので、後から読むと困る場合が多い。

# DIライブラリを調べる

2022/12/

元記事を表示

Go言語をつかった Lambda関数の開発をもっと楽にしたい〜Codespacesを添えて〜

メリークリスマス!
この記事は[朝日新聞社 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/asahi)の24日目の記事です。

## TL;DR
Dockerコンテナ上で RIE と air つかってサクサク開発環境を作りましょう
サンプルは https://github.com/duck8823/sample-lambda にあります。
[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new?hide_repo_select=true&ref=main&repo=581006091)

## 今回の開発スタイル
こんな感じで開発するとしましょう。

– スキーマをOpenAPIで管理したい
– Go でLambda関数を書きたい
– curl で動作確認したい
– ホットリロードほしい
– スキーマから生成されたクライアントを試したい

## Lambda

元記事を表示

OTHERカテゴリの最新記事