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

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

GoのDuck Typingを活用する

本記事は Go Advent Calendar 2021 の16日目の記事です。

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

## はじめに?
Clean Architectureの概念にそって、GoでWebのBackend APIを開発する時に
依存性の注入が多く、特にデータのCRUD処理を行うRepositoryが課題になったので解決策を考えてみました。

## Repositoryが多くなる問題
例えばECサイトでユーザーが購入をするユースケースの場合、
ざっくりと`売る人`, `商品`, `買う人`があって、そのデータたちの取得と保存をするRepositoryがそれぞれあるとします。

その場合、購入のユースケースに必要なリポジトリは3つ以上になってDIするときもコードが長くなって可読性が落ちることや、機能追加時に必要なRepositoryが増えると、更にusecaseに追加するなどによって保守性が低くなります。

“`go
type ConsumerUsecase struct {
consumerRepo repository

元記事を表示

TODOコメントを埋もれさせない

# はじめに

古いプロジェクトであればあるほど見つかるものがあります…
そう,**「忘れ去られたTODOコメント」**です…

“`golang:main.go
// TODO: 後で共通化する
“`

やろうとは思っていたものの工数が取れなかったり,単純に忘れてしまったりした結果,今日を迎えてしまったんでしょう.

そんな悲しいTODOコメントを生み出さないために,TODOコメントからGithubの
issueを自動生成するツールを作成しました.

https://github.com/masibw/gifc

(Githubのissueが作られても埋もれるだろ!という反論は受け付けます)

## 概要

“`main.go
// TODO: implement this
“`
というTODOコメントがある場合,その.gitに登録されている1つ目のremoteに(多くの場合 origin)このようなissueが生成されます.

![スクリーンショット 2021-12-06 23.17.07.jpg](https://qiita-image-store.s3.ap-n

元記事を表示

Goで多段のファイル変換処理をしてみた

## はじめに
Go言語で圧縮ファイル展開処理やフォーマット変換処理などを`io.Reader`, `io.Writer`を使いストリーミングで処理できるサンプルを作ってみました。
ストリーミングでの処理をすることで処理元のデータサイズに依存せずに処理を行うことができます。

## 処理内容
以下の一連の処理を行います。

1. S3(Minio)からgzipファイルをダウンロード
2. gzipファイルを展開しJSONファイルを出力
3. ノーマライズ処理を行い、全角数字を半角に変換
4. JSONからCSVに変換
5. PostgreSQLに対しCOPYコマンドでバルクインサート

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102882/7badb63d-55f7-05fb-1d49-0bbfb9db3a48.png)

## 利用データ
以下の郵便番号データをJSONファイルに加工後、gzip圧縮をしたものをインプットデータとしました。
http://zipcloud.ibsn

元記事を表示

GoでGraphQLサーバを作る

ハンズオン形式で、GoでGraphQLサーバを構築するための基礎知識を紹介します。
完成版は、[GitHub](https://github.com/KamikazeZirou/gql-example)に上げてあります。

## GraphQLの導入
### GraphQLとは

GraphQLは、Facebookが作ったAPI形式です。[公式ページ](https://graphql.org/learn/)から引用します。

“`
GraphQLは、APIのためのクエリ言語であり、データに対して定義した型システムを使ってクエリを実行するためのサーバーサイドランタイムです。
“`

### GraphQLの使い方

まず、GraphQLのスキーマを定義します。

“`graphql
type Query {
me: User
}

type User {
id: ID
name: String
profileUrl: String
}
“`

次に、定義したスキーマを解釈して処理するGraphQLサーバを用意し、リゾルバを実装します。リゾルバはスキーマとデータソー

元記事を表示

勉強する中で知った「Go言語には○○がない」を理解する

こんにちは。Goのアドベントカレンダー17日目の記事です。
普段はPHPをメインに開発していますが、せっかくの機会なので勉強中のGoで記事を投稿に挑戦してみました。

Goを勉強していてPHPや他の言語に比べて2つの「○○がない」という言語仕様に戸惑いました。それは

– Go言語には継承がない
– Go言語には例外処理がない
です。

この2つの仕組みは他の言語ではよく活用しており、可能なら使った方が良いと思って使い続けてきていたので、とても違和感がありました。
なぜGoにはこの2つの仕組みがないのでしょうか。少しでも言語理解を深めるために自分なりに調べてみました。

# さきに結論

– 構造体の埋め込み、インターフェースを利用しよう
– errorインターフェースを利用しよう

# Go言語には継承がない
## そもそも他言語で継承が使われている理由はなぜなのか?
「継承」とは、クラス定義に共通している部分を別のクラスとしてまとめる仕組みのこと。継承を利用することで同じようなクラスを一から作り直す手間がなくなり、共通している部分はまとめて変更するが可能になります。なので、継承を上

元記事を表示

twitterで推しの漫画をより楽しむためのコマンドラインツール「imgdler」を作ってみた

はじめまして、駆け出しバックエンドエンジニアの[かず](https://github.com/kazdevl)です。
何気に自身の技術記事を公開するのは初めてなので多めにみてもらえるとありがたいです。

twitterで推しの漫画をより楽しむためのコマンドラインツール「[imgdler](https://github.com/kazdevl/imgdler)」を作った話について記述します。

本記事は[CyberAgent22新卒Advent Calendar 2021](https://adventar.org/calendars/6671) 15日目の記事です。

https://adventar.org/calendars/6671

## 経緯
つい最近、開発に協力していたTwitter API v2のクライアントライブラリである[gotwtr](https://github.com/sivchari/gotwtr)がリリースされたので、宣伝も兼ねて何か作ろうな〜と考えていました。

ちょうど、twitterに関連した課題を抱えていた私には、ちょうど良い機会でした。

その

元記事を表示

Go1.18からジェネリクスが導入されるらしいので、試してみた

**ジェネリクス**とは、データの型を束縛せず、型そのものをパラメータ化して扱う技術です。
利点としては、型を抽象化して利便性を上げつつ、静的型付け言語の安全性を保つことのできることが挙げられます。

### ジェネリクスを導入する前は
同一の処理をする関数であっても、型が違うだけでそれぞれ実装しないといけませんでした。
例えば、`int`と`float64`で和を求めるシンプルな実装をするとしましょう。
和を求める処理自体は同じなのに、型が違うだけの理由で似たような関数を二つ用意することになります。
https://go.dev/play/p/9uIhwWrlJK1

“`go
func main() {
sumInt := sumInt(1, 2)
fmt.Println(sumInt, ” is “, reflect.TypeOf(sumInt))

sumFloat64 := sumFloat64(1.0, 2.0)
fmt.Println(sumFloat64, ” is “, reflect.TypeOf(sumFloat64))
}

func sumInt(a

元記事を表示

GoでAtCoderをやる話

この記事は、[and factory.inc Advent Calendar 2021](https://qiita.com/advent-calendar/2021/andfactory)の 15日目 の記事です。
昨日は、@hagmonさんの「[【Flutter】アプリ起動時に未処理トランザクションを処理する方法](https://qiita.com/hagmon/items/18fa26307123de793d41)」でした。

# 概要
この記事では業務とは離れてますが、趣味で取り組んでいるAtCoderの話についてまとめてみたいと思います。始めてから半年ほどで、最近やっと水色になれました!この記事ではどんな感じでやっているか、水色になるまで、やって良かったことなどを雑多にまとめていきます。

https://atcoder.jp/users/GoSagawa
![Screen Shot 2021-12-14 at 22.20.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145904/2

元記事を表示

AutifyのWeb APIクライアントを作成しました

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

AutifyのWeb API用のクライアントライブラリを作成したの少しまとめます。
https://github.com/trknhr/autify-go

# Autifyとは
自動E2Eテスト支援ツールです。私の所属している会社で採用されているため私も業務の時間で触ることが多いです。

# このライブラリはなにをするか
Autify Web APIを直接叩く部分をラップします。ユーザーにとってはGoでAPIを呼び出してそのデータを取得するのではなく関数を呼ぶだけで該当のAPIを操作できることになります。
https://autifyhq.github.io/autify-api/#/schedule/post_schedules__schedule_id_

# なぜ作ったか

Autifyのシナリオの中身まで検索したい時がありその時に即興でWeb APIのラッパー的なのを作っていたのでそれをライブラリと

元記事を表示

gonum.org/v1/plot が良かった話

# はじめに

この記事は Go Advent Calendar 2021 の 14 日目の記事です。(執筆時点で 15 日になりそうなのは内緒)
今回は以前簡易的なグラフを作る際に良かった `gonum.org/v1/plot` の紹介をしたいと思います。

# 背景

普段は Go を使ってバックエンドの開発を行っているのですが、たまにグラフをプロットするときがあります。
この辺のプロット周りのライブラリはどの言語にもあると思いますが、Go でも簡単にできないかなと思い探したところ、この plot に出会いました。
細かいグラフを出すのは結構たいへんですが、自分が思っているような簡単なグラフはすぐ生成できました。

# gonum.org/v1/plot で作ったグラフ

まず最初にこの plot で作成したグラフを紹介します。

### 近似数値微分法 を使った 3・5・7・9 点近似数値微分の誤差

![image_08-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216929/c02

元記事を表示

Goで使用しない戻り値、引数は無視しよう

### 戻り値を無視する
この方法は結構使いますね。
関数から受け取った戻り値を使用せず放置すると、コンパイルエラーになってしまいます。

“`go
func main() {
s, ok := plus(1, 2)
println(s)
}
“`
ビルドしてみると

“`go
./main.go:4:5: ok declared but not used
“`

このような時に、使用しない戻り値を無視すると、問題なくビルドが通るようになります。

“`go
func main() {
s, _ := plus(1, 2)
println(s) // => 3
}
“`

## パラメータを無視する
戻り値を「\_」を使って無視するのと同様に、関数の引数も「\_」を使って無視することができます。

“`go
func doSome(_ int, _ int) int {
return 100
}
doSome(1, 2) // => 100
“`

では、一見無駄なように見えるこの機能は、どのようなケースで使われるのでしょうか。

実は、Goには「インターフェ

元記事を表示

Terraform Provider AWSのテストの書き方

[terraform provider aws](https://github.com/hashicorp/terraform-provider-aws)におけるテストの書き方について調べたのですが、Terraform自体のテストの書き方じゃなくてproviderの開発の話はあまりみつからなかったのでまとめました。

# 参考ドキュメントについて
公式の[Acceptance Tests](https://www.terraform.io/docs/extend/testing/acceptance-tests/index.html)
を読んで理解を深めました。

## そもそもどういうテストが行われているのか?
プルリクエストを作成するときにはAcceptanceTestがパスしていないといけないのでAcceptanceTestの書き方を主に記載します。
このAcceptanceテストではterraformのコマンドを実際に実行してAWS providerならAWS上にリソースの作成を行っていました。
なので内部ではterraformのスクリプトを用意してリソースの作成を行います。

元記事を表示

Go言語にジェネリクスが入りそうなのでモナドを作って遊んでみた

この記事は [Applibot Advent Calendar 2021](https://qiita.com/advent-calendar/2021/applibot) 14日目の記事です。
前日は @naotoritty さんの「[Goでのベンチマークツールを作ろうとした話](https://qiita.com/naotoritty/items/3766d2d1aeef7fd17904)」という記事でした。

# はじめに

こんにちは。 (株)Applibotに勤める**型理論信者**エンジニアです。
現在、Goにジェネリクスを導入する動きが進んでいます。
ジェネリクスが入ることでGoは**「ダックタイピングなインタフェース」と「ジェネリクス」を持つ言語**になります。
静的型付けの言語としてはなかなか面白い特徴だと思ったので、モナドを題材にしてこれらがどのように機能するか試してみることにしました。

※この記事は「モナド」と「ジェネリクス(パラメータ多相)」を理解している方向けです

## Goのジェネリクス

はじめに、Goに導入されるであろうジェネリクスについてざっくりと

元記事を表示

GoシングルバイナリDockerイメージビルドでハマったこと

こんにちは、株式会社medibaでバックエンドエンジニアをしている @mdbr92 です。
この記事は [mediba Advent Calendar 2021](https://qiita.com/advent-calendar/2021/mediba) の14日目です。
※記事の内容はあくまで個人の発信であり、会社を代表する意見や見解ではありません。

この記事では
Go 言語で記述した HTTP サーバプログラムを AWS ECS などで動かすために
シングルバイナリ Docker イメージを作成しようとした際に
ハマってしまったことを書きたいと思います。

# なぜシングルバイナリイメージにしたいのか?

Go言語で記述したプログラムはシングルバイナリ
(ランタイムを必要とせず単体で実行できるファイル)にビルドできます。

この実行ファイルのみを scratch(Docker の予約済みの最小限のイメージ)に乗せて
ビルドすると 10MB 前後の小さな Docker イメージを生成することができます。

イメージのサイズが小さいことで、
AWS ECR のようなレジストリへの保

元記事を表示

Goのソースコードのファイル名の末尾が_ios.goだとビルド対象にならない

# 問題
Goで以下のファイル名を使うと多くの場合に問題が生じます。
なぜでしょうか?

“`
hoge_ios.go
“`

# 解答
ファイル末尾の `_ios.go` がbuild constraintだとみなされるため。
Goにはビルド対象の環境毎にソースコードを変えることができるbuild constraintという仕組みがあります。

https://pkg.go.dev/go/build#hdr-Build_Constraints

そのため、Windows環境でのみ利用できる機能とLinux環境でのみ利用できる機能を混在させることもできます。
この指定はファイルの先頭に以下のように書くことができますが、ファイル名で指定することもできます。

“`go
// +build windows
“`

ファイル名で指定する場合は、ファイル名の末尾を `_windows.go` とすると、上記と同じ効果が得られます。

windowsやlinuxなどは良く知られたものなので、目にする機会も多いかと思います
しかし、このbuild constraintに指定できる対象は意

元記事を表示

エラーハンドリングをミスって大事故に

# はじめに
アドベントカレンダー初参加です!
とある企業でサーバーサイドエンジニアとして働いており、主にGoでAPIを実装しています。

今年に入って新規事業の開発を任され、色々やらかしを経験させていただきました。

その中でも一番のやらかしを自戒の念も込めて投稿したいと思います。

*特定を避けるために敢えて分かりづらく表現している箇所があります。その点ご了承くださいmm*

# 惨劇発覚前夜
とある会員制サイトのリリースを控えており、それに備えて色々準備を整えてました。
リリース当日はそれなりにアクセス急増が見込まれるので

– ALBの暖気申請
– フロントエンドサーバーのスケールアウト

等の対応を行いました。

今までも似たようなサイトをいくつかリリースしており、上記の対応でアクセスは捌けていたので今回も同様の対応で問題ないと思ってました。

リリース当日PM20:00 にサイトのURLを公開。

今までをはるかに上回るアクセスが来ましたが、特にサイトの表示につまることはなく、当日のリリース作業を終えることができました。

# 惨劇発覚
次の日、朝起きるとサポート用メアドに

元記事を表示

[Hands-On Serverless Applications with Go] やってみた感想

この記事は [Goのカレンダー | Advent Calendar 2021 – Qiita](https://qiita.com/advent-calendar/2021/go) の3つ目のカレンダーの14日目です。

## はじめに
表題通り、**Hands-On Serverless Applications with Go**という書籍を一通り読んだ感想を書きます。

初めて英語の技術書を読みながら手を動かしましたが、英語で書かれていること自体はいいのですが、**約400P**となると数日で読み終えるのは難しいですね。
この書籍は夏の夏季休暇中に読破したので、2週間ちょっとかけて私は読み終えました。

最近は、[Udemy](https://www.udemy.com/)を筆頭に自分で勉強しようと思ったときにセール中なら書籍を購入するよりも安く学習できるサービスも増えてきています。
しかし、実際の業務レベルのハンズオンになるとweb上のサービスだけでは難しいとも思います。
この書籍は初心者向けでは決し

元記事を表示

誕生日CTFにてコードゴルフを裏開催した話

本記事は[23卒のエンジニア職志望向けAdvent Calendar Advent Calendar 2021](https://qiita.com/advent-calendar/2021/23grads) の10日目の枠が空いていたので、登録された記事です。
11日目の記事は、@yamamoto-yuta さんの [SlackをTweetDeckぽく使えるChrome拡張機能を作った話](https://qiita.com/yamamoto-yuta/items/c9c5ea0912b02aa14e23) です。中々イケてるので、ぜひ読んでみてください!

# はじめに
今年も、誕生日なので初心者から中級者向けに、taskCTFを開催させていただきました。
開催はこれで3回目です([過去の開催レポート](https://qiita.com/task4233/items/09f112076eb5855eeed3))

正の得点を獲得した参加者は36人で、そのうち全完した参加者は8人(22.2%)でした。
ご参加いただいた方々、ありがとうございました :bow:
おかげさまで、今年も楽

元記事を表示

ターミナル上でポーカーのヘッズアップがしたい

こんにちは!株式会社アトラエで「転職サイトGreen」のエンジニアをしている浅水です。

この記事では、僕がポーカーのヘッズアップを愛用のターミナル上でやってみたい!!と夢見そして、
半分成功、半分夢半ばで挫折した話を書いていきたいと思います。

## 作ったもの
![gamen_test1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1743458/565d7d24-7ac5-4f35-e828-29ab4d80ea2e.gif)

こんな感じで、**[go_poker](https://github.com/klein-mask/go_poker)**というTUIで起動するポーカーゲーム(と言えるほどのクオリティではない)を作ってみました。

### 使用したもの
– **Go 1.17**
– **[tview](https://github.com/rivo/tview)**
– TUI作成のライブラリ的な

### できること
– ターミナルでテキサスホールデムのヘッズアップがなんと

元記事を表示

GoでDDDっぽいコードを書く方法をGo初心者が考えてみる

こちらは [ラクス Advent Calendar 2021](https://qiita.com/advent-calendar/2021/rakus) の13日目の記事です。

初めまして。今年の10月にラクスに入社した@Imamottyです。
入社して2ヶ月余りが経過しました。日々覚えることが多く大変ですが、成長を感じる毎日です。
新参者ですが、よろしくお願いします。

# テーマ:「アドベントカレンダー」のドメインモデルを考えて、GoでDDDっぽいコードを書いてみる

さて、本題ですが、チームで開発を担当するアプリケーションのバックエンドにGoを採用することになり、
せっかくなのでGoのコーディングの練習にもなりそうな形でアドベントカレンダーのテーマを考えました。

今回は **「アドベントカレンダー」** をテーマにドメインモデルを考えて、
DDDっぽくコーディングすることを目指していきたいと思います。

ちなみに[A Tour of Go](https://go-tour-jp.appspot.com/)をなんとか完走した感じのGo初心者なので、実装の稚拙さはお許しください

元記事を表示

OTHERカテゴリの最新記事