- 1. スライスのゼロ値を Print すると [] が出力される理由を探ってみた
- 2. Goでモデルのカラムを配列で定義したい
- 3. Goのユニットテストをtestify・テーブル駆動テストで実装した話
- 4. go testのチュートリアルを作ってみた
- 5. goでblockchain実装してみた
- 6. if文とswitch文以外の条件が多いコードの書き方
- 7. 休日Gopherとしての1年半を振り返る
- 8. Hoppii の API を読んでみよう (Golang で API 叩くおまけつき)
- 9. Gormのモデルで外部キーにポインターを利用すると、想定外のデータが取得された
- 10. 「Cobra」を使ってGoの記念日管理CLIツールを作ってみる
- 11. Go言語・ SendGrid ・REST APIでお問い合わせメール送信APIを作った
- 12. Go言語 環境構築 (Windows) GOPATH設定・実行確認まで
- 13. goland + air + delveでdocker環境のリモートデバッグ
- 14. GoでインタラクティブなSlack Botを作る2通りのサンプル(Events API + Interactive Component / Socket Mode)
- 15. 【備忘録】Golangで半角全角の変換を実施する。
- 16. [Go] enum のヘルパー生成や網羅性チェックをするツール enumizer を作った
- 17. Golang 環境構築時のメモ
- 18. [Go] OpenAPI コード自動生成でビジネスロジックに集中する開発へ
- 19. zapとzerologをlumberjackと組み合わせてログローテーションする
- 20. AWS SDK for Go V2 を使ってみる
スライスのゼロ値を Print すると [] が出力される理由を探ってみた
この記事は[フラー株式会社 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/fuller-inc)の21日目の記事です。
## 前書き
以下を実行すると “`
“`が出力されます。 “`go
func main() {
fmt.Print(nil) // ->
}
“`ところで、[Goの言語仕様](https://go.dev/ref/spec#Slice_types)により、スライスのゼロ値は“`nil“`です。そのため、スライスを宣言しプリントすると、“`
“` が出力されると期待しますが、実際は“`[]“`が出力されます。この記事はその謎を追いました。 “`go
func main() {
var a []int
fmt.Print(a) // -> []
}
“`## ネタバレ
“`[]“`が出力される理由は、“`fmt.Print“`を適用した“`a“`の実行時の型がスライス型であり、
“`fmt.Print“`
Goでモデルのカラムを配列で定義したい
# はじめに
モデルの一部のカラムを配列で定義する際、テーブル作成が出来ずに詰まったので解決までの流れを簡単にまとめてみます
## ①pqパッケージのStringArrayで定義すると
“`Catalog.go
import “github.com/lib/pq”type Catalog struct {
gorm.Model
Title string `gorm:”not null”`
Comments pq.StringArray
“`以下を参考にしましたが、こちらはPostgreSQL用でした
https://gorm.io/ja_JP/docs/data_types.html
今回使用しているのはMySQLなので以下のエラーが発生し、テーブル作成ができませんでした
“`
Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax
Goのユニットテストをtestify・テーブル駆動テストで実装した話
この記事はNewsPicksアドベントカレンダー2022の21日目の記事です。
https://qiita.com/advent-calendar/2022/newspicks-tech
# この記事の概要
この記事は、新規プロダクト(toBマルチテナントSaaS)の開発に参加しているインターン生がusecaseのユニットテストを実装するタスクに取り組んだ際に、
– どのような実装をしたか
– どのようなレビューをいただいたか
– どのように修正したかといった部分を徒然なるままに書いた、なんちゃってインターン体験記 ~~(自分語り)~~ です。
AlphaDriveのインターンに参加した際に、どのような形で開発に関わっていけるかのイメージを掴むための一助となれば幸いです。
また、Go及びtestifyを用いたテストコードの書き方の一例として、温かい目で読んでいただければと思います。# 自己紹介
2022年8月から[AlphaDrive/NewsPicks](https://adnp.alphadrive.co.jp/)にてインターンとしてお世話になっております。[t
go testのチュートリアルを作ってみた
# はじめに
この記事は[ディップ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/dip-dev)の21日目の投稿です。
早いもので今年のアドカレも残すところあと5日となりました。弊社ではGoを用いたプロダクトが拡大中+内製化のため鋭意増員中です。
いずれのプロダクトでも単体テストを書く文化が根付いているため、
新規参画メンバーが早く馴染めるように`go test`のチュートリアルを作ってみました。https://github.com/dip-dev/go-test-tutorial
# どんなもの?
あらかじめ実装されているコードに対し、単体テストを作成するチュートリアルです。テストケースの作り方と[gomock](https://github.com/golang/mock)の使い方が学べる内容になっており、
Goに初めて触れる、単体テストを書いた経験が少ないひとをターゲットとしています。課題はchapter5まであり、徐々に難易度が上がっていきます。
また、後半のchapterは実践向け
goでblockchain実装してみた
もういろんな人がやっているかもしれませんが、goでブロックチェーンを実装してみました。
レポジトリはこちらです。https://github.com/greenteabiscuit/go-blockchain
本ネタはこちらでpythonで実装していたものをgoに移植してみた感じになります。
https://hackernoon.com/learn-blockchains-by-building-one-117428612f46
普通のチュートリアルと違うところ
– httpサーバーにして、インタラクティブにしてみました。
– ノードを複数立ち上げて、コンセンサスを取る処理も実装しています。
– 一応テストコードを部分的に書いています。(timeのところが怪しいままになっていますが)## コンセンサスを取るところまでのシミュレーション
readmeにも書かれていますが、シミュレーションをしてみます。
複数ノード立ち上げてみます。“`
$ go run main.go :8080別セッションで:
$ go run main.go :8081
“`8080の
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 mainimport “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です。# 参照した記事
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 mainimport (
“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 intconst (
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