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

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

ラップ?、ラッパー?、サランラップ?となっていた僕がラッパー関数に惚れた瞬間

この記事は ITRC Advent Calendar 2021 の11日目の記事です.

前の記事は @teapod418 の 最近の`AWS CDKを使用してECSを手軽に構築する` です。

# はじめに
– 今年の自分は1年通してコツコツとGolangを触ってきました。WebServerを立ててchannelを使用したwebsocket通信をしたり、TwitterAPIを使用して擬似投票機能を作ったり、GoolgeMapAPIを使用してデートプランを提示したりと、、、。こんなに作ってもまだGolangという言語に対しては苦手意識があります。が、この1年でわからなかったことがわかるようになったということもありました。Websocket、channel、ラッパー関数,etc…

ということで今回はラッパー関数について少し紹介していこうと思います。

# ラッパー関数とは
– ラッパー関数。。。自分も以前どこかで聞いたことはありましたがどんな関数なのか全く分かりませんでした。ラップという言葉を聞いて一番最初に思い浮かぶんだのがサランラップでした。ラッパー関数はサランラップのように何

元記事を表示

【Go言語】gockで外部WebサービスAPI テストを書く

この記事は、弁護士ドットコム Advent Calendar 11日目の記事です。
前日は[akahiro Hayashi(ぴーや)](https://note.com/taka_piya)さんの「[スプレッドシートでプロトタイピングしたら、良いことしかなかった](https://note.com/taka_piya/n/n439c8835f5a7)」でした?

https://qiita.com/advent-calendar/2021/bengo4com

クラウドサイン事業本部プロダクト部でバックエンドのエンジニアをしているmoritamorieです。

ユーザーの方々により便利にサービスを使って頂けるように近年外部サービスとの連携が増えており、連携性を担保するための自動テストの重要度が高まっていると感じています。

日々の開発の中で感じているWeb APIテストのメリットであったり、外部APIをモックするGo言語のサードパーティライブラリ([gock](https://github.com/h2non/gock))の使い方を書いてみたいと思います。

2021年12月時点での

元記事を表示

実戦で役立つ4つの無名関数(Anonymous function) 利用パターン

この記事は [2021年Goアドベントカレンダー2](https://qiita.com/advent-calendar/2021/go) の11日目の記事です。

# はじめに
今年はGoでのWebアプリケーション開発をがっつりしてきました。
今回はそんな実開発で使って/見て学んだ無名関数の利用パターンを書いておこうと思います。

# 無名関数(Anonymous function)とは
関数を変数として扱うものです。
こんな感じで使えます。

“`go:hello_anonymous_function.go
func main() {
// 引数なし
sayWorld := func() {
fmt.Println(“world”)
}

fmt.Println(“hello”)
sayWorld()

// 引数あり
say := func(str string) {
fmt.Println(str)
}
say(“hoo”)
say(“bar”)

// 即時実行
func(str string) {
fmt.Println(str)
}

元記事を表示

アレクサ、助けて

この記事は[Hamee Advent Calendar 2021](https://qiita.com/advent-calendar/2021/hamee)の11日目の記事です。

# はじめに

この記事は「開発してみた」系の記事です。
あまり技術や思想的に「おおお!!!!」となる記事ではありません。
Goでアレクサスキルを作ってみたい。lambdaからDynamoDBに触りたいという人には向いているかもしれません。

# 課題

> 私「(この設計どうしようかな)」
私「アレクサーこの設計どうすればいい?」
アレクサ「わかりません」

そう。アレクサは助けてくれない。
在宅が続き、アレクサと二人っきりの時間が増えようともアレクサは仕事を手伝ってはくれない。外出も減った今とでは天気を聞くこともなく、音楽を流すことしかしない。

せめて相槌でもして欲しい。

そう何か、いい感じに、返事をして欲しい。
# 仕組み

AlexaからLambdaを叩き、DynamoDBから**それっぽい文章**を取ってきてもらう。
Lambdaは最近社内で勉強会があったのでGoを使ってみます。
![スクリ

元記事を表示

「初心者」Golang の二重リンクリスト(Doubly-Linked List)(英語)

Although `list` has rarely been used in Go ([Just about always when you are thinking of a list – use a slice instead in Go](https://stackoverflow.com/a/21328187)), there is an official implementation in the standard library. After reading the implementation ([go standard package: src/container/list/list.go](https://pkg.go.dev/container/list)), I found it very inspiring.

## The Node

Basically, it first defines `Node`, which is referred to as `Element` in the standard package:

“`go
type Ele

元記事を表示

ebitenでのガベージコレクタ処理のライブラリ化

 星はじめさんによる [任天堂switchでのガベージコレクタの処理](https://docs.google.com/presentation/d/e/2PACX-1vQ7NcPdBmoVu83KqhPNNZ3X5BqDdemxgDS8lwpuqYOZNOozodmzL76GnEh8prXp96EKkBpWS5DfJOMa/pub?start=false&loop=false&delayms=3000&slide=id.p) をライブラリ化してみました

“`go
package rtsGarbageCollection

import (
“runtime”
“runtime/debug”
)

// 強制ガベージコレクタの実行
func GC() {
runtime.GC()
}

// golangのガベージコレクタを動かさない
func GcOff() {
GC()
debug.SetGCPercent(-1)
}

// golangのガベージコレクタを動かす
func GcOn() {
GC()
debug.SetGCPercent(100)
}

//

元記事を表示

gRPCサーバー開発入門

# gRPCとは

![スクリーンショット 2021-12-10 12.53.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/a13fc86e-29ef-db02-196b-cc991ca1c4c7.png)

Googleが開発したプロトコルの1つで主にマイクロサービス間(サーバー間)での通信に用いられる。RPC(Remote procedure call:遠隔手続き呼び出し)という技術がベースとなっている。

https://qiita.com/il-m-yamagishi/items/8709de06be33e7051fd2

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/bc73b8b4-335f-a566-c8fa-f69bbe6df88b.png)

## メリット

よくRESTful APIとの違いが挙げられますが優れている点は以下の通りです

・Pr

元記事を表示

gRPCの各言語向けパッケージ生成を一括管理する

この記事は [DeNA Advent Calendar 2021](https://qiita.com/advent-calendar/2021/dena) の10日目です

11/30にリリースした [PLAYBACK 9](https://playback9.jp/) では、クライアントとサーバーとのやり取りに gRPC を利用しています。
gRPCではIDLを利用してAPIを表現でき、クライアント及びサーバーのスタブコードを自動生成できるため非常に簡単に利用することができます。

しかしながら、生成したコードをどのように管理するかどうかは各自に委ねられており、ベストプラクティスが定まっているわけではありません。
インターネットでも様々な方法が公開されており、一番よく見かけるのは Git の Submodules を使い、共通の proto ファイルから各自コード生成を行うという方法です。

この方法は簡単ではありますが、

* コード生成の責務が各利用者に発生する
* 各言語で、どの時点のコードを利用しているか分かりづらい

といった問題があります。

この問題に対して、GitH

元記事を表示

Go 言語の reflect : 最初の一歩

reflect package に苦手意識がある人は多いのでは?と思います。
自分自身もあまり使ってなかったのですが、 encoding/json 的な package として excel に入出力するものを作った時にある程度理解が進みました。
ここでは、最低限のコードにより reflect package を少しだけ説明します。

# reflect package とは

> Package reflect implements run-time reflection, allowing a program to manipulate objects with arbitrary types. The typical use is to take a value with static type interface{} and extract its dynamic type information by calling TypeOf, which returns a Type.
>
> A call to ValueOf returns a Value representing

元記事を表示

gRPC-Goのサーバー実装を読む

この記事は[Mobility Technologies アドベントカレンダー2021](https://adventar.org/calendars/6771)の10日目です。

![スクリーンショット 2021-12-10 9.08.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148416/3c0065d6-3e69-a684-986c-dfe568d3e08c.png)

MoTではサーバーサイドのサービス間通信にgRPCを使用しています。
gRPCはprotobufのスキーマ定義から必要なコードが自動生成出来るため、
なんとなくで使えてしまうところがAPI作成の手間と難易度を下げてくれているのですが、
`なんとなく`の部分が気持ち悪くもあったためこの機会にGoのgRPCライブラリであるgrpc-goの実装を調べてみました。
ただし、この記事ではスキーマからのコード生成やアプリケーションでの利用方法については説明しません。

gRPCは通信プロトコルにHTTP/2を使用しており、バイナリフ

元記事を表示

Go の気になったコミット (2021 年 11 月)

[golang/go](https://github.com/golang/go) の master ブランチに行われたコミットから個人的に気になったものをリストにしたものです。

前回作成したリストはこちら。

https://qiita.com/sg0hsmt/items/c2c77653b3f5361b1aa1

軽く説明を追加していますが勘違いや誤りがあるかもしれません。

## Topic

– 既存の標準パッケージよりも改善された IP アドレス表現を提供する net/netip が追加されました。
– 新しい GC Pacer (GC をいつ動かすか決定するアルゴリズム) が実装され、デフォルトで有効になりました。
– 安全ではないとされている証明書の署名や TLS バージョンに対する扱いが変更されています。

## Commits

### 2021-11-02

https://github.com/golang/go/commit/a59e33224e42d60a97fa720a45e1b74eb6aaa3d0

既存の標準パッケージよりも改善された (小さく比較可

元記事を表示

[Go]Slackで古い投稿を一括削除する

この記事は [DENSO アドベントカレンダー 2021](https://qiita.com/advent-calendar/2021/denso) の10日目の記事です。

年末大掃除の時期となりました。古くなったSlackの投稿を一括削除して、気持ちよく新年を迎えるための機能をGo言語で実装しました。

# 概要
SlackのAPIトークンと、Slackチャンネル名を設定してプログラムを起動します。日付を入力し確定すると、入力した日付より古い投稿を削除します。

“`shell:
$ ./cleaner
This program delete SLACK messages older than the date you enter.
Enter date in the format like 2006/01/02: 2021/11/28
Are you sure you want to delete messages of Channels [“memo” “aws-cost”] older than 2021/11/28? (Y/n) >y
start.
Deleted.

元記事を表示

Go 1.18 で追加される `any` は `interface{}` のエイリアス

先日、次の Issue を教えてもらって「any って type parameters 専用じゃなかったの?」と驚いたので調べてみました。

https://github.com/golang/go/issues/49884

結論から書くと Go 1.18 で追加される `any` は `interface{}` のエイリアスとして事前定義された識別子なのでどこでも使えます。
最新の仕様 [^1] にも次のように記載されています。

> For convenience, the predeclared type any is an alias for the empty interface.

[^1]: https://tip.golang.org/ref/spec#Interface_types

## 型制約のための any (2021 年 1 月 12 日~)

https://go.dev/blog/generics-proposal

https://github.com/golang/go/issues/43651

Go でジェネリクスをサポートするための仕様変更は

元記事を表示

やらかしちまって自動販売機の前で泣いた話

こんにちは!入社3ヶ月目を迎えるザハです!こちらは金属加工プラットフォームを開発・運用するCatallaxyの[Catallaxy Advent Calendar 2021](https://qiita.com/advent-calendar/2021/catallaxy)の10日目の記事になります。9日目の記事はちいかわさんによる「[Reactではじめるキノコ狩り](https://qiita.com/catallaxy/items/17dc6327c10e2e3efc5e)」でした。

チャレンジングなアウトプットを虎視眈々と狙いながら、配属されたプロダクトでIssueをこなす毎日を過ごしていますが、いざ記事を書くとなると何を書いていいのやら。。。という訳で本日は、苦肉の策として、これまでの経歴でやらかしちまった&経験した話を赤裸々にお話ししたいと思います!

# 夏の秋葉原

遡ること2006年だか2007年だか、もはや昔過ぎて正確に覚えてはいませんが、レンタルサーバーが主流でサーバー操作をミスると、レンサバに電話して5000円払って、電源を入れてもらう時代の話です。はい、もちろ

元記事を表示

GraphQL(gqlgen)でのエラー定義とエラーコード化

# はじめに

最近筆者は GraphQL という言葉を耳にする機会が増えてきたなと感じています。新規開発として立ち上がったサービスでは GraphQL を使うというところも多いのではないでしょうか。
今回のこの記事では GraphQL サーバーにおいてエラーコードの概念を取り入れたときの実装 gqlgen における簡単な実装方法を紹介します。

# この記事の話

– GraphQL でエラーコード周りどう実装するのか
– gqlgen で実装すると スキーマでエラーコードを実装して、SetErrorPresenter で整形する

# GraphQL 上でエラーコードを使用する

GraphQL に限らず、REST など様々な形態の API ではクライアント側とエラーコードを予め決めておき、そのコードに応じてクライアント側の制御を行うといった手法が多く使われると思います。
具体的には発生するエラーに対して固有のコードを設定し、このエラーコードならこのメッセージを出そうとかこういう遷移をしようという使われ方をします。
Firebase では以下に示したリンク先のように固有のコードが

元記事を表示

Goのmonorepoとworkspace mode

僕はmonorepoが好きで、これまでGoのsingle-module構成とmulti-module構成どちらも実運用してきました。最近ではメルカリShopsがmonorepoを採用して話題になったりとにわかに盛り上がっていて嬉しくあります。
https://engineering.mercari.com/blog/entry/20210817-8f561697cc/

さて、来たるGo 1.18の目玉はやはりGenericsで影に隠れがちですが、multi-moduleの体験を向上させるworkspace modeという機能が入る予定です。
https://github.com/golang/go/issues/45713

この記事ではGoでmonorepoするときの一般的な構成であるsingle-moduleとmulti-module、そしてworkspace modeが入ったあとの世界について見ていきたいと思います。
※ workspace mode自体はまだ頻繁にCLが取り込まれていてリリースされるまでに変更が入る可能性が非常に高いです

また本記事での実行環境は以下の通りで

元記事を表示

GoとRepositoryパターンと集約またぎのトランザクションと

[Wano Group Advent Calendar 2021](https://qiita.com/advent-calendar/2021/wano-group) の記事です。

教義通りにRepositoryでトランザクション貼ってるDDDやらレイヤードアーキテクチャやら関心の分離やらの記事はあれど、**Repisitoryをまたいだトランザクション**のサンプルってそんなに多くないですね。

多くのスタートアップで現実的には向き合わなきゃいけなさそうな気もするんですが、みんな分散トランザクションの天才とかなのかしら…(
一部プロジェクトでやってるトランザクションのパターンを本稿では扱おうと思います。

# 要約

* トランザクションは主に各アプリのusecaseで貼ってる
* context.Contextにmutableなトランザクションオブジェクトを詰めてる
* repositoryにはcontextからORMのオブジェクトを復元する関数自体をDIしてる

# 前段:保存したいモデル/RDB上の構成/Goのパッケージ構成
こんなかんじのmodelで、この中

元記事を表示

Go の image/color パッケージの color.RGBA に透明度を正しく指定する&過ちの共有

# まえがき
これは[株式会社ピーアールオー(あったらいいな!を作ります) Advent Calendar 2021](https://qiita.com/advent-calendar/2021/pro-japan1) 2日目の記事です。
初日は [pro_matuzaki](https://qiita.com/pro_matuzaki) さんの「[周回遅れで試すNotion API](https://qiita.com/pro_matuzaki/items/43d492f6491410e68e5d)」でした。
また本記事の内容は[個人ブログの記事](https://blog.84b9cb.info/posts/go-colorcode-to-rgba/)の再編です。

**開発環境**
go version go1.16.5 linux/amd64
# 要約
Go の image/color パッケージの color.RGBA に設定する RGB 値は、透明度を 0 ~ 1 に正規化した値を RGB 値に掛け合わせた値を用います。
つまり R: 162, G: 173, B: 5,

元記事を表示

Go、ポインタにするか値にするかの方針を考えてみた

## はじめに
この記事は[2021年Goアドベントカレンダー(3)](https://qiita.com/advent-calendar/2021/go)の9日目の記事です。

ポインタにするか値にするか考え方針をまとめてみました。

この記事で書かれていることは既に多くの方が考えたり記事にしたりしていますが、どうするべきか迷うことがあり、例となるコード付きで方針をまとめたいと考え記事にします。(この記事の内容は個人的な方針です。サービスの特性などで変わる点はあると思います。)

以下の3つのパターンで記載しています。

– 構造体について
– 関数の引数について
– メソッドのレシーバについて

間違いなどありましたら教えていただけると嬉しいです。

### 構造体について
#### 方針
– 構造体のフィールドに、スライスやmap、ポインタなどの参照型を持つ場合はポインタ
– 変更不可な構造体として、運用する場合は値でも良い(コンストラクタを定義し必ずコンストラクタで生成するようにする、不変なオブジェクトなど)
– 迷ったらポインタ

構造体のフィールドに、スライスやmap、ポイ

元記事を表示

Go言語+Elasticsearchで簡易求人検索バックエンド構築

# Go 言語+Elasticsearch で簡易求人サイトバックエンド構築

この記事は、マイナビ Advent Calendar 2021 9 日目の記事です。

今回の記事のソースコードは、[GitHub](https://github.com/ekusiadadus/go-hr-backend)で公開しています。

フォルダ構成は以下のようになります。

“`
.
├── README.md
├── batch
│ ├── LoadData.go
│ ├── go.mod
│ ├── go.sum
│ └── test_data.xml
├── docker-compose.yml
├── es
│ ├── dic
│ │ └── test_dic.csv
│ ├── Dockerfile
│ ├── script
│ │ └── es_init.sh
│ └── sudachi
│ └── sudachi.json
├── search_api
│ ├── Dockerfile
│ ├── go.mod

元記事を表示

OTHERカテゴリの最新記事