- 1. 【Go】Go ver1.18 からジェネリクスが使えるようになった【ジェネリクス】
- 2. goのdbのチュートリアルのos.Getenvが正しく環境変数を参照しない問題への暫定的な解決策
- 3. AgoutiでWebブラウザの操作を自動化してテストする
- 4. [Go] `context.Context` が `ctx` という名前で、関数の第一引数に渡されているかを調べる静的解析ツールを作った
- 5. 【#44 エンジニア転職学習】GinTutorialのWebApp改造 DB管理追加(GORM)
- 6. 【Go】testcontainers-go で MySQL 関連のテストを書く
- 7. Go: Yahoo 郵便番号検索API の使い方
- 8. Go言語で Collectionを用意してみる
- 9. 【CDK】 色んな言語でCRUD API作る【Go】
- 10. Go言語でyesコマンド
- 11. 【#43 エンジニア転職学習】GinTutorialのWebApp改造 PUT/DELETE
- 12. go のコンパイラが死んだ (go 1.18.4)
- 13. 「A Tour of Go」 の Exercise: Maps を解きました
- 14. 「A Tour of Go」 の Exercise: Slices を解きました
- 15. 「A Tour of Go」 の Exercise: Loops and Functions を解きました
- 16. Go言語の初学者が go mod を使って自分で作ったローカルのモジュールを引っ張ってこれるようにするまで【Go Modules】
- 17. [翻訳]チュートリアル: GoとGinによるRESTfulなAPI開発(原文: Tutorial: Developing a RESTFul API with Go and Gin)
- 18. GoでTopicごとにPubsubするWebsocket
- 19. Go+API Gateway+Lambda+DynamoDBでサーバレスなAPI
- 20. 【#42 エンジニア転職学習】GinTutorialのWebApp改造
【Go】Go ver1.18 からジェネリクスが使えるようになった【ジェネリクス】
## はじめに
2022年3月なので、既に数ヶ月以上前の話にはなりますが…
Go のver1.18がリリースされ、新機能としてジェネリクスが使えるようになりました。
現在私が仕事で触っているのはver1.16なのでジェネリクスの恩恵を受けていないのですが
どうやらものすごく便利な機能らしいので少し触ってみようかなと思います。## ジェネリクスとは??
>ジェネリック(総称あるいは汎用)プログラミング(英: generic programming)は、具体的なデータ型に直接依存しない、抽象的かつ汎用的なコード記述を可能にするコンピュータプログラミング手法である。 wikipediaより~~ちょっと何言ってるか分からない。~~
静的型付け言語ではお馴染みの機能らしいが、ver1.18以前のGoにはなかった機能。
超ざっくり言うと、関数とかで汎用的に(generic)型を受け付けるような形で定義できるみたい。
~~動的型付け言語ばっかり触ってたからよく分からない~~## ver1.18以前
リリースノートでの例を使って触ってみる。環境は、[前回使ったDocker環境](http
goのdbのチュートリアルのos.Getenvが正しく環境変数を参照しない問題への暫定的な解決策
# 発生している問題
Go言語でリレーショナルデータベースにアクセスするチュートリアル、[Tutorial: Accessing a relational database](https://go.dev/doc/tutorial/database-access#set_up_database)の「Get a database handle and connect」のセクションで`os.Getenv`で環境変数を参照する箇所が存在する。
そこで、環境変数DBUSERをキーに指定した際に`root`を表示したいものの、`username`と表示されてしまう。resourceコマンドで`~/.zshrc`を更新しても同様の状況になりDBへ接続できない。
## 暫定的な解決策
UserとPasswdのバリューに直接rootとrootのパスワードを追加する。“`go
func main() {
cfg := mysql.Config{
// 本来はこのように書きたいが、username、localhostと表示される。
//User:
AgoutiでWebブラウザの操作を自動化してテストする
# 概要
GolangのWebDriverであるAgoutiを使用して、UIテストを自動化する方法を紹介します。
本記事ではID/パスワードでログインを行うようなサイトでのデモを紹介します。:::note
AgoutiではUIテストの自動化だけでなく、Webスクレイピング的に情報取得の自動化もできます。
::::::note warn
物によってはブラウザゲームの自動化やログインボーナスの収集ツールのようなものも作れますが、利用規約等に従って活用するようにしましょう。
:::# 前提条件
– この記事内ではWindows環境前提での紹介とします。
– Goバージョン1.18.4
– ブラウザはChromeを前提とします。# 事前準備
Chromeのバージョンに従って、ChromeDriverをインストールする。
![2022-07-31_16h50_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/08edc687-eece-3b17-9ca1-3958ff88
[Go] `context.Context` が `ctx` という名前で、関数の第一引数に渡されているかを調べる静的解析ツールを作った
# 目的
– `context`パッケージの[公式ドキュメント](https://pkg.go.dev/context)に `Context` について以下のように記載されています
> Do not store Contexts inside a struct type; instead, pass a Context explicitly to each function that needs it. The Context should be the first parameter, typically named ctx:
ざっくりとした意味としては
> `Context` は構造体に埋め込むべきではなく、それそれの関数に明示的に渡すべきである。関数の第一引数にすべきで、`ctx` という名前をつけるのが典型的だ。
– 個人的にはこれが一種のコーディングルールのような感じになっているので、静的解析でチェックできるようにすれば楽そうだと思いました
## 実装
### テストコード
まずはテストコードから書いてみました。
より静的解析っぽくするために `context
【#44 エンジニア転職学習】GinTutorialのWebApp改造 DB管理追加(GORM)
# はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。GoのフレームワークであるGinを中心に、
webアプリ開発学習をしていきます。バックエンドエンジニアになるまでの学習内容は以前投稿した以下の記事を基にしています。
https://qiita.com/Chika110/items/ef54dddd565a0193ef44
# 本日の学習内容
GinのTutorialで作成したAPIを改造して、簡素なWebアプリを作成しようと思います。
本日はアプリ内データのMySQL管理機能を追加しました。* **GORMを使用したMySQLデータ管理 ←Topics!!**
# GORMを使用したMySQLデータ管理
Ginのtutorialではメモリ上でのデータ記録だったため、サーバを切断すると変更したデータが消えてしまいました。
この問題を解決するために、「MySQL」およびGoのORMである「GORM」を導入していきます。##### WebApp改造で追加する機能等
* APIのP
【Go】testcontainers-go で MySQL 関連のテストを書く
## 前置き
MySQL を扱うコードをテストする場合、いくつかの方法があると思います。
1. 別プロセスで MySQL サーバを建てておく
2. mock を利用する
3. in-memory な MySQL 実装を提供するライブラリを利用する
4. テストプロセス内でテスト用の MySQL コンテナを建てる1 はテストを実行するプロセスの外部で予めテスト用の MySQL を実行しておく方法です。
この方法はかなりお手軽ですが、テスト全体で 1 つのデータベースを共有することになる点がデメリットです。
MySQL を利用するテストが複数ある場合、互いに影響しないようにテスト毎にデータを削除する処理が必要になります。
また、テストの内容によっては複数のテストを並列実行することができません。2 は MySQL を扱う部分を interface で抽象化し、その interface を実装する mock を利用してテストをする方法です。
Go だけでテストが完結し、軽量な mock 実装を利用することで高速なテストを実現できる点が魅力です。
一方で実際にクエリが実行されるわけで
Go: Yahoo 郵便番号検索API の使い方
参考ページ
[郵便番号検索API](https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/zipcodesearch.html)“`go:get_address.go
// —————————————————————
//
// get_address.go
//
// Jul/31/2022
// —————————————————————
package mainimport (
“os”
“fmt”
“io/ioutil”
“net/http”
“encoding/json”
“github.com/joho/godotenv”
)// —————————————————————
func json_parse_proc(str_
Go言語で Collectionを用意してみる
## 概要
Go言語で他言語にあるコレクションを実現してみる企画。この際、Go言語の適正は一旦度外視する。> 試行錯誤しつつ頭を整理するための実装を晒しているものなので、正解を知りたい人は別記事を見た方が良い。
## 実装
まずは、共通処理としてのコレクションを実装してみる。シンプルで利用頻度の高そうな関数はこんな感じだろう。
– contains
– filter
– map1
– foldLeft
– foldRight
– reverse
– headTailなお、`Add`相当の `append(slice, elm)`, `Get`相当の `slice[i]`は既存実装のまま利用するのが最良と考えたのでこららの関数は用意していない。
> 用意した関数の最後に挙げた `headTail`は 先頭要素の`head`と 次要素移行の tailを同時に返す関数として用意した。Go言語は複数の戻り値をサポートしているので、こういうことができる。片方しか不要なのであれば `head, _, _ := c.HeadTail()` という形で不要な方を捨てれば良い。そうは
【CDK】 色んな言語でCRUD API作る【Go】
# この記事について
[AWS CDKv2](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-construct-library.html)でCRUD操作ができるAPIを作る
今回はGoを使う# プロジェクト初期化
## CLIのインストール
CLI自体はnodeのものを使う(ので導入済みならスキップ)“`bash
npm install -g aws-cdk
cdk –version
“`バージョンが表示されればOK
## CDK Toolkitのデプロイ
初回のみCDKを利用する際に必要となるファイル群のデプロイが必要
→これもやったことがあるならスキップ“`bash
cdk bootstrap aws://${ACCOUNT}/${REGION}
“`以下のように表示されればOK
“`bash
✅ Environment aws://${ACCOUNT}/${REGION} bootstrapped.
“`※異なるアカウント、リージョンでCDKを利用する場合はまたこの作業が必要になる
#
Go言語でyesコマンド
# Go lang始めてみた
[A Tour of Go](https://go.dev/tour/welcome/)のConcurrency以外を読み終えた。
ここまでの内容をまとめるのにちょうど良さそうなのでyesコマンドを実装してみた。# 仕様
– 1つ目のコマンドライン引数が”-h”または”–help”ならばヘルプメッセージを表示
– コマンドライン引数がなければ”y”をひたすら出力
– その他の場合はコマンドライン引数を” “でjoinした文字列をひたすら表示
– ~~最適化を頑張らない~~# コード
https://github.com/NI57721/go-scripts
“`go:yes.go
package mainimport (
“fmt”
“io”
“os”
“strings”
)type yesReader struct{
yes string
reader io.Reader
}func (r *yesReader) Read(b []byte) (int, error) {
n, err := r.rea
【#43 エンジニア転職学習】GinTutorialのWebApp改造 PUT/DELETE
# はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。7月いっぱいまでGoのフレームワークであるGinについて、
学習をしていきます。バックエンドエンジニアになるまでの学習内容は以前投稿した以下の記事を基にしています。
https://qiita.com/Chika110/items/ef54dddd565a0193ef44
# 本日の学習内容
GinのTutorialで作成したAPIを改造して、簡素なWebアプリを作成しようと思います。
本日はAPIにメソッドを追加しました。* **PUT/DELETEメソッド追加 ←Topics!!**
# PUT/DELETEメソッド追加
GinのtutorialではGETとPOSTのみ実装だったので、
先日挙げたタスク通り、まずはPUTとDELETEメソッドを追加実装します。##### 追加する機能等
* **APIのPUTとDELETE**
* albumデータのDB管理
* ブラウザ上での表示(HTMLから)
* キーワード一致のG
go のコンパイラが死んだ (go 1.18.4)
# これは何?
go のコンパイラが死んだので報告。
# 殺す方法
以下のコードをコンパイルすると死ぬ。
“`go:go1.18
package mainimport “log”
type Obj interface{ Hoge() string }
type objType struct{}func Send[T Obj](obj T) {
func() { obj.Hoge() }()
}func foo(o Obj) { Send(o) }
func (o *objType) Hoge() string {
log.Println(“objType.Hoge”)
return “objType.Hoge”
}func main() { foo(&objType{}) }
“`実行結果はこう
“`
$ go1.18.1 run main.go
2022/07/30 20:12:04 objType.Hoge
$ go1.18.2 run main.go
2022/07/30 20:12:07 objType.Hoge
$ go1.1
「A Tour of Go」 の Exercise: Maps を解きました
引き続きGo公式のチュートリアル「[A Tour of Go](https://go-tour-jp.appspot.com/list)」を読み進めています。その中に練習問題がいくつか用意されています。当記事は、Mapに関する練習問題「[Exercise: Maps](https://go-tour-jp.appspot.com/moretypes/23)」を解いた記録です。
## コード
“`go
package mainimport (
“golang.org/x/tour/wc”
)func WordCount(s string) map[string]int {
ret := make(map[string]int)
left := 0
for i, val := range s {
// 空白を見つけてsの left ~ i-1番目まで(i番目は空白) の単語の値をインクリメントして
// leftを更新する。leftの更新時に+1 しているのは空白をスキップするため
if ‘ ‘ == val {
ret[s[left:i]]++
「A Tour of Go」 の Exercise: Slices を解きました
引き続きGo公式のチュートリアル「[A Tour of Go](https://go-tour-jp.appspot.com/list)」を読み進めています。その中に練習問題がいくつか用意されています。当記事は、Sliceに関する練習問題「[Exercise: Slices](https://go-tour-jp.appspot.com/moretypes/18)」を解いた記録です。
# コード
“`go
package mainimport “golang.org/x/tour/pic”
func Pic(dx, dy int) [][]uint8 {
ret := make([][]uint8, dy)
for i := 0; i < dy; i++ { ret[i] = make([]uint8, dx) for j := 0; j < dx; j++ { // 式によって表示される画像が変わる ret[i][j] = uint8(i^j) // ret[i][j] = uint8((i^2) * (j^
「A Tour of Go」 の Exercise: Loops and Functions を解きました
GCが標準で備わっていてかつ高速な言語を使えるようになりたいと思い、Goに入門。公式のチュートリアル「[A Tour of Go](https://go-tour-jp.appspot.com/list)」を読み進めています。その中に練習問題がいくつか用意されています。当記事は、関数に関する練習問題「[Exercise: Loops and Functions](https://go-tour-jp.appspot.com/flowcontrol/8)」を解いた記録です。
# コード
“`go
package mainimport (
“fmt”
)func Sqrt(x float64) float64 {
z := 1.0
for i := 0; i < 10; i++ { z -= (z*z - x) / (2 * z) } return z } func main() { fmt.Println(Sqrt(2)) } ``` # 解説 ## コード 用意された関数を任意回ループするだけなので簡単です。このアルゴリズムはA Tour of Go で
Go言語の初学者が go mod を使って自分で作ったローカルのモジュールを引っ張ってこれるようにするまで【Go Modules】
新参者なので Go言語 を使ってモジュールを切り出す手法として $GOPATH を設定する方法と Go Modules(go mod コマンド) を使用する方法とで混乱してしまったのですが Go Modules の方が新しく2019年度の公式サイトのモジュール解説ページでも使用されており、これからの主流になりそうなのでこちらを使うことに。
公式チュートリアルだけではあまり理解できてる気がしなかったので記事にしました。
公式チュートリアルもおすすめですが自分でディレクトリを切って作ったモジュールを import したい人がすぐに把握できるようにまとめています。参考:Understanding go.mod and go.sum – https://faun.pub/understanding-go-mod-and-go-sum-5fd7ec9bcc34
参考:Go Modules Reference – https://go.dev/ref/mod#go-mod-file## go.mod とは何か ~前提の知識~
現ディレクトリの goファイル上 におけるモジュールの依存関係
[翻訳]チュートリアル: GoとGinによるRESTfulなAPI開発(原文: Tutorial: Developing a RESTFul API with Go and Gin)
## この記事について
この記事はTutorial: Developing a RESTful API with Go and Ginを翻訳したものになります(2022/07/29最終更新)。ソースコード以外は意訳が含まれている可能性があるので、気になる箇所は[原文](https://go.dev/doc/tutorial/web-service-gin)をご参照ください。
## 目次
– 準備
– APIのエンドポイントの設計
– コードのフォルダを作成
– データの作成
– すべてのアイテムを返すハンドラーを書く
– 新しいアイテムを追加するハンドラを書く
– 特定のアイテムを返すハンドラを書く
– 総括
– 完成したコードこのチュートリアルでは、Go言語と[WebフレームワークGin](https://gin-gonic.com/docs/)(以降Gin)によるRESTFulなwebサービスのAPIを書くための基本を紹介します。
もしGo言語とそのツールに慣れているなら、このチュートリアルから多くのことを得られるでしょう。
もしあなたがGOを触るのが初めてということで
GoでTopicごとにPubsubするWebsocket
# はじめに
こんにちは
クェスタ株式会社エンジニアの下澤です。毎秒定期的に送られてくるデータをリアルタイム表示する開発があり、“`AppSync“`を検討していたのですが、コストがかかるため、Websocketで代用しました。
PubsubをGolangで実装してみたので、簡単にシェアします
# 環境
“`Golang“`と“`gorilla/websocket“`, “`echo“`を使います。
“`shell
go version go1.16.5 darwin/amd64
github.com/gorilla/websocket v1.5.0
github.com/labstack/echo
“`# Github
https://github.com/lil-shimon/lil-pubsub# 環境構築編
適当にファイルを作成し、Go環境の準備
“`shell
mkdir lil-pubsub && cd lil-pubsub
go mod init# e.g. go mod in
Go+API Gateway+Lambda+DynamoDBでサーバレスなAPI
# はじめに
こちらの記事はGoとAPI Gateway + Lambda + DynamoDBでサーバレスなAPIを作る記事となっています。
前回の記事の続きとなっているため、一部手順を省略しています。https://qiita.com/tkhs1121/items/b1e332acdbc50fad8c45
https://qiita.com/tkhs1121/items/18d8ba86f1afdec13381
# 環境
MacBook Air M1
開発言語 Go# 手順
## Lambda関数の作成一から作成のままランタイムを`Go.1.x` アーキテクチャを`x86_64`にして関数の作成をします。
![Lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391445/e76764b3-3f67-c9c6-092f-efcfdf99e889.png)### 必要なパッケージのインストール
“`
go get -u github.com/aws/aws-sdk-
【#42 エンジニア転職学習】GinTutorialのWebApp改造
# はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。7月いっぱいまでGoのフレームワークであるGinについて、
学習をしていきます。バックエンドエンジニアになるまでの学習内容は以前投稿した以下の記事を基にしています。
https://qiita.com/Chika110/items/ef54dddd565a0193ef44
# 本日の学習内容
GinのTutorialで作成したAPIを改造して、簡素なWebアプリを作成しようと思います。
本日はそのための機能・仕様策定、API・タスク整理をしました。* **アプリ開発タスク整理等 ←Topics!!**
# アプリ開発タスク整理等
先述のとおり、Ginのtutorialで作成したalbum APIに機能追加・DB連携等して簡素なWebアプリを作成します。
本日はタスク整理でほとんど終了しましたので、明日より設定したタスクを1つずつ切り分けて実施していきます。##### 追加する機能等
* APIのPUTとDELETE
* al