- 1. Go言語:Go1.22 で機能強化された net/http.ServeMux について、ちょっとしたこと
- 2. 【Go】EchoとmongodbをDockerで環境構築して、実装とテストまでやってみた
- 3. なぜgo.workはリポジトリにコミットすべきではないのか
- 4. golang-migrateでマイグレーションをやってみる[Mac]
- 5. GoとLaunchDarklyでフィーチャーフラグを実装する
- 6. Goのインターフェースと依存性注入(DI)
- 7. Go言語(Golang) sort
- 8. Hugoのshortcodeでmarkdownify関数が正しく動作しなかった
- 9. 【個人開発】最もジェネレーティブで、最もアーティフィシャルで、そして最もインテリジェンスなやり方でRedisを実装した話
- 10. Go言語(Golang) “godoc”と”go doc”
- 11. Go言語(Golang) Goroutine記述例
- 12. GopherCon 2024 Recap: Exploring the Go Compiler: Adding a “four” loop
- 13. Go言語(Golang) Goroutine記述例
- 14. AWS SAM + Go + DynamoDB local + GitHub Actions で環境構築する
- 15. Go言語:http.Get のレスポンスボディの処理で失敗
- 16. Go言語(Golang) 並行処理(goroutineとchannel)
- 17. 休日に新しい言語に触れたい ~Go言語編~
- 18. Go言語で画像付きのツイートを投稿する
- 19. 先日作ったGo言語用モジュールを ChatGPT でコードレビューしてもらいました
- 20. 【Go】validatorのタグでカスタムメッセージを設定する
Go言語:Go1.22 で機能強化された net/http.ServeMux について、ちょっとしたこと
いささか、旧聞に属しますが、今年の初めに出た Go1.22 で HTTP サーバーのルーティングに使われる net/http.ServeMux の機能が強化されて、HTTPメソッドの指定ができるようになり、かつ URL パターン文字列にワイルドカードが使えるようになりました。例として、次のような書き方ができるようになりました。
“`
mux := http.NewServeMux()
mux.HandleFunc(“GET /test/{id}”, Test)
…
“`このように書くと、“` handler “` 側で “` Request.PathValue “` メソッドを使うことにより “` {id} “` の値を取得できるようになりました。
“`
func Test(w http.ResponseWriter, r *http.Request) {id := r.PathValue(“id”)
fmt.Printf(“id = %s\n”, id) // {id} の値が表示される
…
“`使えそうな機能強化ですが、ふと、疑問が頭
【Go】EchoとmongodbをDockerで環境構築して、実装とテストまでやってみた
# 1. はじめに
今回、Goを使ったAPIサーバーを構築しようとした際、アーキテクチャの知識やテストの方法などについて調べる機会があったので、忘備録も兼ねてこの機会にまとめようと思います。
アーキテクチャにも触れますが、今回の主題はechoとmongoを使った環境構築とテストですので、アーキテクチャが気になった方は他の記事も参考にしてください。今回のリポジトリです。
少々フォルダ構成が異なっていますがアーキテクチャ含め大部分は同じです。https://github.com/yupon-pro/go-mongodb
– [1. はじめに](#1-はじめに)
– [2. 環境構築](#2-環境構築)
– [2-1. Go](#2-1-go)
– [2-2. mongodb](#2-2-mongodb)
– [3. レイヤードアーキテクチャとDDD](#3-レイヤードアーキテクチャとddd)
– [3-1. レイヤードアーキテクチャ](#3-1-レイヤードアーキテクチャ)
– [3-2. DDD](#3-2-ddd)
– [3-3. 実装の
なぜgo.workはリポジトリにコミットすべきではないのか
## 本記事の背景と目的
go言語のWorkspace modeを導入した際に生成される`go.work`ファイルは,リポジトリにコミットすべきでないとの指摘がある[[1](https://poyo.hatenablog.jp/entry/2022/12/05/090000)][[2](https://future-architect.github.io/articles/20220216a/)].この点について[Proposal](https://github.com/golang/go/issues/53502)でも盛んに議論されており,[公式リファレンス](https://go.dev/ref/mod#go-work-file)では`go.work`をリポジトリにコミットしないよう推奨されている.
本記事では,`go.work`をリポジトリにコミットすると困りうるパターンを検証し,`go.work`をコミットすべきでない理由を明らかにする.https://github.com/golang/go/issues/53502
https://go.dev/ref/mod#
golang-migrateでマイグレーションをやってみる[Mac]
Goで`GORM`を使わずにDB設計を行っていたのですが、どうにかデータベースのカラムだけを変更することがしたいと考えた時に、Djangoで`マイグレーション`を行っていたことを思い出したので,今回どうやってGoでマイグレーションを行うか調べてみました。
# そもそもマイグレーションとは
`マイグレーション`とは、一般的に移行という意味を持っています。今回行う`データベースマイグレーション`とは、データベースの定義を自動的に作成・管理することを指します。
従来の直接データベースに入って操作していたデータベース定義をスクリプトで操作することができます。
# `golang-migrate`でマイグレーションしてみる。
まず、golang-migrateのcliツールインストールします。
### インストール
“`
brew install golang-migrate
“`
>windowsのパッケージマネージャーとかは使ったことないのですいません以下のコマンドで入っているかを確認します。
“`
migrate –version
“`## マイグレーション
GoとLaunchDarklyでフィーチャーフラグを実装する
## はじめに
業務でフィーチャーフラグを実装をする機会があり、技術調査の一環でフィチーチャーフラグのプラットフォームである[LaunchDarkly](https://launchdarkly.com/)を使って実装してみました。この記事では、Go言語とLaunchDarklyを使った具体的なフィーチャーフラグの実装方法について解説します。フィーチャーフラグ自体の概要やメリットについては、多くの記事で詳しく説明されていますので、ここでは割愛します。
フィーチャーフラグについては、よくわからないという方は以下の記事がおすすめです。
[フィーチャーフラグ(Feature Flag)はなぜ必要なのか?](https://codezine.jp/article/detail/14114)
[Feature Flag](https://martinfowler.com/bliki/FeatureFlag.html)## やること
この記事では以下の内容で進めます。
・LaunchDarklyでフィーチャーフラグを設定する
・設定したフィーチャーフラグをSDKを使って取得する##
Goのインターフェースと依存性注入(DI)
# 1. はじめに
昔、オブジェクト指向の記事を書いた時、ポリモーフィズムの実装のために使われるインターフェースを記述したことがあるのでインターフェース自体の理解はあったつもりだったのですが、Goではどのようにインターフェースが実装されるのかや、これがどのように処理の抽象化につながるのか(特にDI)ということについて理解が甘かったです。
今回参加したプロジェクトでインターフェースやDIを利用する機会があったので、忘備録も兼ねて自分なりの理解をまとめてみようと思います。# 目次
– [1. はじめに](#1-はじめに)
– [2. インターフェース](#2-インターフェース)
– [3. DI](#3-di)
– [4. おわりに](#4-おわりに)
– [5. 参考](#5-参考)# 2. インターフェース
インターフェースはメソッドの束を定義し、データを抽象化したりポリモーフィズムを実装するためなどに使われます。ポリモーフィズムはインターフェースを適用するクラスに対して、インターフェースに記述されたメソッドの実装を要求します。即ち、インターフェースはその具体的な実装をもたず、
Go言語(Golang) sort
“`go
package mainimport (
“fmt”
“sort”
)func main() {
i := []int{5, 3, 2, 8, 7}
s := []string{“d”, “a”, “f”}
p := []struct {
Name string
Age int
}{
{“Nancy”, 20},
{“Vera”, 40},
{“Mike”, 30},
{“Bob”, 50},
}// pスライスをNameフィールドでソート
sort.Slice(p, func(i, j int) bool { return p[i].Name < p[j].Name }) // ソートされたスライスを出力 fmt.Println(i, s, p) } ``` ### 解説 1. **パッケージのインポート**: ```go import ( "fmt" "sort" ) ``` - `fmt`パッケージはフォーマットされたI/Oを提供します。 - `so
Hugoのshortcodeでmarkdownify関数が正しく動作しなかった
# はじめに
あるサイトで利用しているHugo(gohugoio)のMarkdownコンテンツファイルを別のサイトにコピーしたところ、shortcodeが正しく動作しなくなりました。
shortcodeを利用したい理由はtableをレンダリングしたいためで、参考資料に載せている[How Create Bootstrap Tables in Hugo](https://www.mybluelinux.com/how-create-bootstrap-tables-in-hugo/)をほぼそのままコピーしています。
環境の違いなどはあると思いますが、根の深そうな問題にみえたので、デバッグをした時のメモをまとめておきます。
:::note
最終的にHugoのDiscourseに[記事](https://discourse.gohugo.io/t/the-markdownify-function-calls-asciidoctor/51411)を投稿してみました。
:::# 環境
* Ubuntu 22.04.4 LTS (amd64版)
* Hugo v0.133.1+exte
【個人開発】最もジェネレーティブで、最もアーティフィシャルで、そして最もインテリジェンスなやり方でRedisを実装した話
はじめまして!もんたです。
私もんた、「[もんたの森](https://www.montanomori.com/)」っていうもんた版イラストやみたいなWebサービスを趣味で開発しているのですが、最近そのもんたの森にRedisを導入しまして、今回はそのお話をしようかなと思います。
この記事を読んで僕と同じかけだしエンジニアの個人開発のモチベーションにつながれば幸いです!
あ、そういえばいろいろやらせてもろてます。
よかったら覗いてみてあげてください。**【たまーに描いた絵をアップする X ( Twitter ) 】**
https://x.com/monta_no_mori
**【最近始めた Instagram 】**
https://www.instagram.com/monta_no_mori/
**【もんたのLINEスタンプ】**
https://store.line.me/stickershop/author/2887587/ja
## 1. **プロジェクト概要**
### 背景
![image.png](https://qiita-image-st
Go言語(Golang) “godoc”と”go doc”
### `go doc`と`godoc`の違い
**1.使用方法**:
– `go doc`: コマンドラインで直接使用
– `godoc`: ウェブサーバーを起動し、ブラウザで閲覧**2.機能**:
– `go doc`: シンプルなドキュメント表示
– `godoc`: 詳細なドキュメント表示、ソースコードリンク、検索機能**3.インストール**:
– `go doc`: Go標準ツールチェーンに含まれる
– `godoc`: Go標準ツールチェーンに含まれる**4.用途**:
– `go doc`: 素早い情報確認
– `godoc`: 包括的なドキュメント閲覧**5.出力形式**:
– `go doc`: テキスト形式
– `godoc`: HTML形式(ブラウザで表示)### `go doc`の例
**1.パッケージのドキュメントを表示**:
“`sh
go doc fmt
“`**2.特定の関数のドキュメントを表示**:
“`sh
go doc fmt.Println
“`
Go言語(Golang) Goroutine記述例
“`go
package mainimport “fmt”
// producer関数は、0から9までの整数をfirstチャネルに送信します
func producer(first chan int) {
defer close(first) // 関数が終了する前にチャネルを閉じる
for i := 0; i < 10; i++ { first <- i // チャネルに整数を送信 } } // multi2関数は、firstチャネルから受信した整数を2倍にしてsecondチャネルに送信します func multi2(first chan int, second chan int) { defer close(second) // 関数が終了する前にチャネルを閉じる for i := range first { // firstチャネルから値を受信し、チャネルが閉じられるまでループ second <- i * 2 // 受信した整数を2倍にしてsecondチャネルに送信 } } // multi4関数は、secondチャネルから受信した整数を4倍にし
GopherCon 2024 Recap: Exploring the Go Compiler: Adding a “four” loop
## はじめに
本記事は GopherCon 2024 の発表である [Exploring the Go Compiler: Adding a “four” loop](https://www.gophercon.com/agenda/session/1341852) の Recap のためのエントリです。こちらの内容は、元々 [Go 1.23 リリースパーティ & GopherCon 2024 報告会](https://gocon.connpass.com/event/324888/)で発表する予定でしたが、発表時間が15分しかなく具体的な実装を追う時間がなさそうなので、こちらの記事で具体的な変更差分をシェアすることとしました。
## 本記事で触れることと触れないこと
– 触れること
– 当該発表の概要
– コンパイラの処理の概要
– 構文追加における具体的な変更差分
– 触れないこと
– Goにおける用語の詳細な説明
– Statement、arrayなど
– よく知らない場合は[GoのSpecification](https://go.dev
Go言語(Golang) Goroutine記述例
“`go
package mainimport (
“fmt”
“sync”
)// producer関数は整数チャンネルに整数を送信します。
func producer(ch chan int, i int) {
// チャンネルにi * 2を送信
ch <- i * 2 } // consumer関数はチャンネルから受信した整数を処理し、WaitGroupのDoneメソッドを呼び出してカウントを減らします。 func consumer(ch chan int, wg *sync.WaitGroup) { // チャンネルから受信した整数を処理 for i := range ch { fmt.Println("process", i*1000) wg.Done() } } func main() { // WaitGroupを初期化 var wg sync.WaitGroup // 整数チャンネルを作成 ch := make(chan int) // 10個のプロデューサーゴルーチンを起動 for i := 0; i
AWS SAM + Go + DynamoDB local + GitHub Actions で環境構築する
# はじめに
先日、業務で`AWS SAM` `Go` `DynamoDB local` `GitHub Actions` を使って環境構築する機会がありました。
しかし、この組み合わせについて紹介した日本語の記事があまりない印象でしたので本記事で紹介したいと思います。
ぜひ本記事を参考にして、マイクロサービス開発の第一歩を踏み出してみてください!# SAMプロジェクト作成
1. **プロジェクトを作成するディレクトリに移動**
– プロジェクトを作成するディレクトリに移動します。
“` bash
$ cd develop # develop部分は自身のプロジェクトディレクトリを入力
“`
2. **`sam init` コマンドを実行**
– コマンドを実行しSAMプロジェクトを作成します。
– コマンドを実行すると対話形式のプロンプトが出力されます。以下、実際のプロンプトにコメントアウトで補足しております。
“` bash
$ sam initYou can prese
Go言語:http.Get のレスポンスボディの処理で失敗
## どんな問題か
[net/http](https://pkg.go.dev/net/http) の Get などを使ってリクエストをかけた時、返ってきたレスポンスのボディは必ず閉じなければいけない、というのは、あちこちで言われていまして、わりとよく知られていることかと思います。
もちろん、[net/http](https://pkg.go.dev/net/http) のドキュメントにも、冒頭に書かれています。> The caller must close the response body when finished with it:
“`
resp, err := http.Get(“http://example.com/”)
if err != nil {
// handle error
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
// …
“`なので、上の [net/http](https://pkg.go.dev/net/http) のサンプルコードのように、__defer__
Go言語(Golang) 並行処理(goroutineとchannel)
“`go
package mainimport “fmt”
// goroutineは整数スライスsの要素の合計を計算し、結果をチャネルcに送信します。
func goroutine(s []int, c chan int) {
sum := 0
// スライスsの各要素をループで回し、sumに加算していきます。
for _, v := range s {
sum += v
}
// 計算した合計値sumをチャネルcに送信します。
c <- sum } func main() { // 整数のスライスsを初期化します。 s := []int{1, 2, 3, 4, 5} // 整数型のチャネルcを作成します。 c := make(chan int) // goroutineをゴルーチンとして起動します。これにより並行処理が行われます。 go goroutine(s, c) // チャネルcから値を受信し、それを変数xに代入します。 x := <-c
休日に新しい言語に触れたい ~Go言語編~
# はじめに
最近あるサイトで、仕事で使われている言語ランキングを見ていたのですが、そのTop10に入っているもののほとんどが、私が触ったことのない言語でした。
これは非常にまずい状況だと思ったので、一通り触ってみて、しっくりきたものを深く勉強していこうと思います。
その第一弾として、Go言語を触ってみました。休日1日分でできるところまで進めた分を記事にします。
私はC#やPythonを仕事で使っているため、これらの知識をベースにして理解を広げます。同じような境遇の方の理解の助けになれば幸いです。
# 環境構築
## 環境
OS: Ubuntu22.04
エディタ: vs code## Goのインストール Windowsの場合
1. [公式サイト](https://go.dev/dl/)からGoをダウンロードします。
Windowsの型はmsiファイルをダウンロードしてインストールすれば、完了です## Goのインストール Ubuntuの場合
1. [公式サイト](https://go.dev/dl/)からGoをダウンロードします。
今回はVe
Go言語で画像付きのツイートを投稿する
# 初めに
個人で和歌をテーマにした以下のスマホ向けのおみくじアプリを開発・運用しています。
先日作ったGo言語用モジュールを ChatGPT でコードレビューしてもらいましたまた、ベタなネタなんですが。
モノは前回のコレですね↓。[IPv4 アドレスからその所属国のカントリーコードを検索するためのGo言語用モジュールを作ってみました](https://qiita.com/suka-test/items/576746d650f25f999f28)
## レビュー講評
レビューしてくれとお願いして、モジュールの本体のソースコード(コメント入れて700行ちょっと)を貼り付けたら、こんな答えが返ってきました。
![ChatGPT.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3872080/0e06851e-e57e-3229-6482-24de93c1ceb3.jpeg)
## 作者本人の感想
とりあえず、致命的な問題は指摘がなかったので一安心。
「ポジティブな点」も挙げてくれるのは、ちょっとうれしかったり(他愛のない)。
「改善提案」については、妥当なとこかなと思います。
特に1.〜5.は早めに修正しようと思ってます。
6.の「ユニットテストの実装」は、実装済みな
【Go】validatorのタグでカスタムメッセージを設定する
# はじめに
バリデーションライブラリである`go-playground/validator`は非常に強力ですが、デフォルトのエラーメッセージをフィールドごとにカスタマイズしたい場合があります。そこで、今回はカスタムメッセージをタグで設定できるようにするライブラリ`cmvalidator`を作成したので紹介します。https://github.com/go-playground/validator
# デフォルトのバリデーションメッセージの課題
通常、`go-playground/validator`を使用して構造体をバリデートする際には、次のようなデフォルトのエラーメッセージが生成されます。
“`go
package mainimport (
“github.com/go-playground/validator/v10”
)type User struct {
FirstName string `validate:”required”`
LastName string `validate:”required”`
Age