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

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

if文とswitch文以外の条件が多いコードの書き方

# この記事のまとめ
この記事は2分で読めます。

多くの条件分岐が必要なビジネスロジックがあるときに、if文やswitch文で書くとコードが長くなってしまって見づらいときあると思います。
言語によるのですがkey-value構造と無名関数を使ったテーブルプログラミングで書くと、きれいに書けるときがあるというお話です。
サンプルはgolangとtypescriptで記載しています。
省略記法ができるtypescriptはいい感じになったのですがgolangでは微妙だったので、アロー記法ができる言語限定かもしれないです。
完全に同じ処理であればkey-valueを使った配列のみで書けてしまうため、分岐内でちょっと違うことをしているケースを例にしました。

# golangの場合
## 環境
go version go1.18.3 windows/amd64

## if文で書いた場合

“`golang:ifhello.go
package main

import “fmt”

func main() {
inputstr := 1
outstr := “”

// if

元記事を表示

休日Gopherとしての1年半を振り返る

# はじめに

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

タイトルにある「休日Gopher」なんて言葉はこの世界にないと思います。
私が勝手に作りました。休日にしか`Go`を触る機会がないGopherのことをそう呼ぼうと思います。
転職をきっかけに脱休日Gopherとなりました。このタイミングをきっかけに
エンジニア歴2年半くらい、`Go`歴1年半くらいの @_otakakot_ が休日に`Go`を学びはじめ、`Go`を使いたいというモチベーションで転職するまでに至った活動を振り返りたいと思います。(2021年4月くらい ~ 2022年11月くらい)
学びの方法は合う合わないがあると思うので「こんな方法もあるんだなぁ」くらいの気持ちで読んでいただければと思います。
`Go`に興味がある方、Gopherを目指している方の取り組みの参考になれば嬉しいです。

# やってよかったこと

## 動画視聴による導入

コンテンツ:Udemy [【Go入門】Golan

元記事を表示

Hoppii の API を読んでみよう (Golang で API 叩くおまけつき)

「[法政大学情報科学部 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/cis_hosei)」20 日目の記事になります。

こんにちは、情報科学部の磯貝です。

昨年度から同級生との雑談で始めた「[法政大学情報科学部 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/cis_hosei)」ですが、同級生だけでなく、他学年や他学部の皆さんにも投稿していただいているということでめちゃくちゃな広がりを実感しています。
今年度のカレンダーを立ててくれた [@HirokiLucky](https://qiita.com/HirokiLucky) と、昨年度の立ち上げと今年度の立ち上げの協力をしてくださった [@AbeTetsuya20](https://qiita.com/AbeTetsuya20) に感謝します。

さて、今回は「Hoppii の API を読んでみよう」ということで、(案外知られていない?) 法政大学で使用されている学習支援システ

元記事を表示

Gormのモデルで外部キーにポインターを利用すると、想定外のデータが取得された

# 最初に
Gormを利用していて、テストの最中にバグにぶつかってしまい、苦労しました。
そのため、今回の記事を共有のために、記事として残そうと思いました。

# 事象
Gorm (v1.23.8) で、モデルの外部キーにポインターを利用してNULLを許可した際に、Joinを用いてデータを取得すると、参照先のデータが想定と異なる場合がありました。

以下のデータを例に説明します。

Userテーブル
| ID | Name | CorporateID |
|:-:|:-:|:-:|
| 1 | Aさん | 1 |
| 2 | Bさん | NULL |
| 3 | Cさん | NULL |
| 4 | Dさん | 2 |

Corporateテーブル
| ID | Name |
|:-:|:-:|
| 1 | A社 |
| 2 | B社 |

下記のプログラムは単純にユーザーと企業テーブルをJoinして、ユーザーに企業が紐付いていれば企業名を表示するプログラムです。
ただ、実行すると想定した挙動と異なってしまいました。

“`go
type Corpor

元記事を表示

「Cobra」を使ってGoの記念日管理CLIツールを作ってみる

こんにちは、Imamottyです。

こちらは「[ラクス Advent Calendar 2022](https://qiita.com/advent-calendar/2022/rakus)」の18日目の記事になります。
(投稿遅くなりました・・!!!)
昨日は @mzuk さんの[「記憶の構造からプログラミング学習を考える」](https://qiita.com/mzuk/items/a0ca68ce4a658a7b4fc2)でした。

# はじめに
私は最近業務でGoを扱っており、CLIツールをGoでサクッと作れるようになりたいと思っているため、
今回のアドベントカレンダー参加に際して、自己学習も兼ねてGoでサンプルCLIツールを作ってみました。
今日はそのお話を書いていきたいと思います。

## 3行まとめ
– Go言語用のCLIツール作成ライブラリは [Cobra](https://github.com/spf13/cobra) がとても有名です
– [Cobra](https://github.com/spf13/cobra) はCLIツール作成に必要な便利機能を数多く備え

元記事を表示

Go言語・ SendGrid ・REST APIでお問い合わせメール送信APIを作った

Go言語と SendGrid を使って、Jsonファイル形式で送られてきたデータをメールで送信したい!と、思ってネットで調べたけど自分にピッタリの記事が無かったので、いろんな記事を読みあさってなんとか完成させました…。
というのも、モバイル開発においてお問い合わせフォームの内容をWebを使って送信する必要があったので、モバイル側から送られてきたデータをWebを通してメール送信をするプログラムを作成したかったのです。

8時間にも及ぶこの戦いの戦果をここに記そうと思います。
OSはWindowsです。

# 参照した記事

Goでメール送信!Twilio SendGridを使って簡単に実装する方法

https://qiita.com/katekichi/items/d94e078b376151858ca4

# 事前準備( SendGrid )

まずメール送信を肩代わりしてくれるサービスSendGridを登録する必要があります。
申請をして、早くて数時間、遅くても1営業日で審査は終わります。SendGridは月12,000通までのメール送信なら無料で使えます。ちなみに私は申請内容

元記事を表示

Go言語 環境構築 (Windows) GOPATH設定・実行確認まで

Windowsでの Go言語 の環境構築の方法をまとめました。

# Goをインストール

まず下記リンクのGoのサイトからインストーラをダウンロードします。

https://go.dev/dl/

下のような画面が出たら、自分のPCのOSに合ったインストーラをダウンロードしてください。

今回はWindows(一番左「MicrosoftWindows」)を選択した場合で説明を進めていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2388259/24703acb-7ca1-b94d-978a-5e57c5bb78ca.png)

ダウンロードできたらそのファイルをクリックして実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2388259/eed12749-91d5-87a8-7a19-5d48bfe33ce8.png)

↑ここから何回か「Next」を押したら、

元記事を表示

goland + air + delveでdocker環境のリモートデバッグ

こんにちは、トレタでサーバーサイドエンジニアをしている神山と申します。

こちらはトレタアドベントカレンダー12日目の記事です。
この記事ではdocker-compose環境におけるgolangのリモートデバッグについて記載したいと思います。

# 概要
docker-composeを使ってgolangの環境を構築し、そこでapplicationを動作させています。
既にairのホットリロードにより差分をすぐ反映することができるため、そこまで気にせず開発を進めていました。
ですがサービスのコード量や複雑な要件が増えるにつれて、デバッグが徐々に辛くなってきました。
そこでデバッグできるようにdelveを導入してみました。

# 環境
– MacBook Pro(Apple M1)
– go version go1.19.4 linux/arm64
– Docker Compose version v2.13.0
– air v1.40.4
– delve v1.20.1

# docker-compose.yml

docker-composeファイルはこのように書きました。

“`y

元記事を表示

GoでインタラクティブなSlack Botを作る2通りのサンプル(Events API + Interactive Component / Socket Mode)

# はじめに

この記事は[CyberAgent PTA Advent Calender](https://adventar.org/calendars/7539)19日目の記事です。

W杯終わりましたね!! メッシすごい! エンバペすごい! ABEMAすごい!!

さて、所属しているABEMA AdsではSlack Botによるデプロイ管理や、非エンジニア向けツールの提供を行っており、自分も初めてインタラクティブなSlack Botを作成する機会がありました。

インタラクティブなSlack Botを作成する際には、既に非推奨になったもの[^1]も含め、複数のAPIが提供されており、調べている際に少し戸惑った部分もあったので、具体的な実装例も含めてまとめておきます。

# ゴール

以下のものを作成しながら、関連情報をまとめていきます。

– ユーザーとインタラクティブなやりとりを行い世界の主要都市の天気の情報を取得できる
– botをGoで作成します
– Slack APIのクライアントpkgとして https://github.com/slack-go/slack を使

元記事を表示

【備忘録】Golangで半角全角の変換を実施する。

### 対応
表題通り、Golangで半角全角の変換を実施する記事です。カタカナは半角→全角、英数字は全角→半角に変換。

“`go:main.go
package main

import (
“fmt”

“golang.org/x/text/width”
)
func main(){
targetString := “ABC123アイウABC123アイウ”
fmt.Println(“変換前”, targetString)
fmt.Println(“変換後”, width.Fold.String(targetString))
}
“`

“`go:実行結果
~/go/src/jikken$ go run main.go
変換前 ABC123アイウABC123アイウ
変換後 ABC123アイウABC123アイウ
“`

元記事を表示

[Go] enum のヘルパー生成や網羅性チェックをするツール enumizer を作った

## はじめに

Go言語には列挙型を定義する機能がないため、代替として iota を使用したり、 `type Color string` のように定義した型の値を const ブロックで列挙したりすることが多いと思います。

“`go
type Sushi int

const (
Salmon Sushi = iota
Tuna
Squid
)

type Color string

const (
Red Color = “red”
Green Color = “blue”
Blue Color = “green”
)
“`

これらの型定義と const での値の列挙を行っただけでは扱いにくく、通常 string 型への変換を行うメソッドや、初期化時/初期化後に値が定義域内に収まっているかのバリデーションを行う関数/メソッドを定義することになります。また、場合によってはその enum 相当の型が取り得る値のリストを取得したくなることもあります。これらのような関数/メソッドを生成するコードジェネレータはいくつかありますが、

元記事を表示

Golang 環境構築時のメモ

# 概要
– golang の学習を始めるにあたり手元で go開発環境の整備を行った時のメモ
– 改訂2版 みんなのGo言語 (https://www.amazon.co.jp/dp/4297107279) を参考にしました

# 前提
– mac環境での構築例

# この記事でやっていること
– go 本体を導入する
– GOROOT GOPATHについて確認する
– hello world してみる
– gore 等のパッケージ導入をしてみる
– ghq + peco を導入する

# golang 開発環境の構築

## goのインストール
– 公式サイトを確認 https://golang.org/dl/
– macでbrewを用いる場合
“`
> brew install go
> go version
go version go1.19.3 darwin/arm64
“`
– 以後 go1.19.3 での事例

## GOROOT設定
– GOROOTは`go env GOROOT` で確認できる。
– goのインストールパスのことをGOROOTと呼ぶ。
– 以前はG

元記事を表示

[Go] OpenAPI コード自動生成でビジネスロジックに集中する開発へ

# はじめに

今回は Go 言語で OpenAPI のコード自動生成を試してみたいと思います。「コード自動生成って何だ?」という方や「OpenAPI ってそもそも何?」という方にもわかりやすく解説していこうと思います。

まず、OpenAPI でコード自動生成ができると以下の嬉しいことがあります。

* ただの作業になりがちなモデルの作成が自動化できる
* 仕様書通りにモデルや API インターフェースが自動生成されるので、バグが入りにくい
* 仕様書通りのリクエスト・レスポンスかどうかを簡単にバリデーションできる
* その結果、**ビジネスロジックに集中する開発ができる**

です。
今回のサンプルコードはこちらに置いてあります。

https://github.com/Nyanchu/sample-go-echo-openapi

# OpenAPI とは

[OpenAPI](https://swagger.io/specification/) とは、 REST API の定義を記述する仕様のことです。例えば、以下は「`GET /users` API を叩いたら200ステータ

元記事を表示

zapとzerologをlumberjackと組み合わせてログローテーションする

# はじめに
今回の記事では、高速なロギングライブラリであるzap、zerologと豊富なログローテーション機能を持つlumberjackライブラリを組み合わせる方法を紹介しようと思います。

# lumberjackの設定項目

lumberjackでは以下の項目でログローテーションを制御できます。
– ログファイルのパス
– ローテーションサイズ(メガバイト単位)
– 最長保持期間(日単位)
– 最大保持数
– ログの日時情報にローカル時刻を利用するかUTCを利用するか
– ローテーション後にgzipで圧縮するか

https://pkg.go.dev/gopkg.in/natefinch/lumberjack.v2#Logger
“`golang
type Logger struct {
// Filename is the file to write logs to. Backup log files will be retained
// in the same directory. It uses -lumberjack.log in

元記事を表示

AWS SDK for Go V2 を使ってみる

自分用メモです。
なお、Go について詳しいなどではないため、誤りなどがあればご了承ください。

# 環境

+ Mac OS X 12.6.1
+ Go 19.4
+ `aws configure` コマンドを実行し、認証情報は設定済み

# Go のインストール

homebrew を使って入れる

“`
$brew install go

$which go
/usr/local/bin/go

$go version
go version go1.19.4 darwin/amd64
“`

# とりあえず HelloWorld

[サンプルで学ぶ Go 言語:Hello World](https://www.spinute.org/go-by-example/hello-world)

“`
package main
import “fmt”
func main() {
fmt.Println(“hello world”)
}
“`

“`
# 実行
$go run hello-world.go
hello world

# ビルド
$go build hel

元記事を表示

リファクタするのって難しいね

リファクタリングってしていますか?
取り急ぎ動くものを作ったけれど後から見ると色々改善できたりすることあるのではないでしょうか。
簡単に自分のリファクタリング例を載せていきたいと思います。

処理としては、
ユーザーをID検索し、退会済のユーザーであればエラーを出力するようにします。
“`
package main

import (
“fmt”

“golang.org/x/xerrors”
)

// user ユーザー定義
type user struct {
name string
id uint
userType uint
}

// userList ユーザーリスト
type userList []*user

// filterByIDs ユーザーリストからidで対象のユーザー検索
func (list *userList) filterByIDs(ids []uint) userList {
out := userList{}
for _, v := range *list {
for _, id := range ids {

元記事を表示

<AA木じゃねぇ 木のAAさ>

## 序

こんにちは、[42tokyo Advent Calendar 2022](https://qiita.com/advent-calendar/2022/42tokyo) の18日目を担当する、在校生のyokawadaです。
42tokyoでは主にカチコミをしています。

皆様におかれましては、職場で、学校で、あるいはご家庭での「木を可視化したい!」との思いに日々お悩みのことと思います。
本記事が、そのような状況への一助となりましたら幸いです。

## 問題設定

一言でいうと「二分木の構造をAA(アスキーアート)で可視化する」。
たとえばこんな感じに:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102690/c5360109-088b-3905-45d0-d4f179f11bd2.png)

## (二分)木ってそもそも何よ

本題ではないので、ざっとだけ説明する。

– 木
– 「ノード(節点)」同士を「エッジ(辺)」で繋いだ、いわゆるグラフ構造のうち、閉路を持

元記事を表示

Google Go Style Guideを読んでみよう! – Style Decisions編

## はじめに
みなさん、こんにちは!
Go大好きエンジニアの[くろたく](https://twitter.com/TakumaKurosawa)です。

ちょっと前になりますが、GoogleからGoのスタイルガイドが発表されましたね?

元記事を表示

hugo-academicでポートフォリオを作成する

# この記事について
hugo-adcademicにより、Github Pagesを利用してポートフォリオを公開するまでの手順を共有します。
ご参考までに私が作成したWebページは[このような形](https://junffy.github.io/)になっています。

# ポートフォリオを作成する目的
ポートフォリオは自己紹介だけではなく、自身のこれまでの活動やスキルを他者(人事担当者、エンジニア)にすぐに理解してもらえることに役立ちます。
もし、転職を検討している場合、準備して公開しておくことで人事担当者の方の目に付いてご連絡いただく機会を得ることもできます。

また、ポートフォリオの更新は、自分のこれまでについて改めて見つめ直すことや、足りない部分・これからのチャレンジしたいことを発見する良い機会になります。

# 本環境
– Macbook Air 2020
– Intel Processor
– macOS Ventura 13.1
– hugo v0.101.0+extended darwin
– go version go1.19
– Homebrew 3.6.15

元記事を表示

Go ファイル分割

## 初めに
ファイルを分けて管理したい
Nodeみたいに `const hoge = require(“hoge”)`すればよいだけではないらしい
備忘録として残しておく

## 同一package(同じディレクトリ)で分ける
“`go:main.go
package main

func main() {
// 同一packageなのでimportが必要ない
Bar()
}
“`
“`go:bar.go
package main

import (
“fmt”
)

func Bar() { // 外部ファイルで使用する場合、頭文字は大文字
fmt.Println(“bar”)
}
“`
“`shell
# go.modがある場合
# runやbuild時に全てのmain packageを指定する
go run main.go bar.go

# go.modがある場合
go run .
“`

## 別package(ディレクトリ)に分ける
*go.modが必要*
***`go mod init go_test`***
“`
go_test
– ma

元記事を表示

OTHERカテゴリの最新記事