- 1. mockが期待した値を返さない
- 2. Goでenumを使用する
- 3. Go言語におけるAtoiとItoa
- 4. [go + htmx] 簡単なチャットWebアプリを作る
- 5. GoLangとMailgunで実装する自動メール送信機能
- 6. 無を犠牲にするfloatパーサーを作る
- 7. 【Go並行プログラミング】A Tour of Goの説明が頭に入らない人のためのゴルーチン&チャネル入門🌟
- 8. Go + Bun + Atlas でマイグレーション周りを自動化する
- 9. go.modが作成されない🔰
- 10. Golangの構造体の初期化方法~FunctionalOptionパターン編~
- 11. Go言語の基礎 S2
- 12. Go言語の基礎 S1
- 13. はじめてのgRPC
- 14. チャネル「右から、右から何かが来てる〜」
- 15. [Go]カバレッジ計測結果ファイルのデータサイズ抑制
- 16. Echoで固有リクエストヘッダ検証によるCSRF対策
- 17. 【Go】rangefuncでループ終了後にfor文本体を呼び出すとエラーになる
- 18. 【30歳/完全未経験/独学】webアプリを作製しました【Golang, Next.js, MySQL, Docker, GitHub Actions CI, AWS Fargate on ECS】
- 19. A Tour of Goエラー:zsh: command not found: gotour
- 20. A Tour of Go: Equivalent Binary Trees の回答例
mockが期待した値を返さない
## 問題
– mockが期待した値を返してくれない## 回答
– mockオブジェクトを使いまわしてないですか?
– mockに異なる振る舞いをさせたいときは、新たなmockオブジェクトを用意する必要があります
– 逆に、新たに用意しないと、前回の`on`メソッドの指示が更新されず、残ってしまいます## 例
“`GO
// Test 1
uc := usecase.NewMockUseCase()
uc.On(“FetchData”, mock.Anything, 1).
Return(&model.Data{}, nil)
h = NewHandler(uc, nil)
uc.On(“FetchCollectionsList”, mock.Anything, 1).
Return(&model.Collections{}, nil)_, err := h.HandleCollectionList()(writer, request)
assert.Equal(t, nil, err)// Test 2
uc = useca
Goでenumを使用する
Go で機能を作成しているときに、enum のような形で文字列を扱いたい場面がでてきました。
しかし、Go には厳密な意味での enum 型が存在しないため、その類似した機能を実現する方法を書き留めます。# 方法 1: iota を用いた定数ブロックの作成をする
iota は定数宣言(const)で利用できる識別子で、型なしの整数の連番を生成します。
以下では、iota を用いて連番を生成し、それに対して String()メソッドを定義します。“`
package mainimport “fmt”
type YearNumberEnum int
// iotaを用いて連番を生成する
const (
Showa YearNumberEnum = iota
Heisei
Reiwa
)// iotaを用いて生成した連番に対して、別名を与えて定義する
func (yn YearNumberEnum) String() string {
switch yn {
case Showa:
return “昭和”
case Heisei:
return “
Go言語におけるAtoiとItoa
# AtoiやItoaに使われるAはASCIIのこと
AtoiとItoaは文字列と整数間の変換を行う際の関数です。
Atoiは「ASCII to Integer」の略になります。ASCII(アスキー)以外の文字列にも対応しています。
strconvのパッケージに属しています。# Atoi (ASCII to Integer):文字列→整数
このコードでは、文字列 “123” を整数 123 に変換しています。変換に失敗した場合、エラーが返されます。
“`golang
package mainimport (
“fmt”
“strconv”
)func main() {
str := “123”
num, err := strconv.Atoi(str)
fmt.Println(“変換結果:”, num)
}
“`# Itoa (Integer to ASCII):整数→文字列
“`golang
package mainimport (
“fmt”
“strconv”
)func main() {
[go + htmx] 簡単なチャットWebアプリを作る
# はじめに
htmx や golang の websocket や html/template 周りの使ってみようということでWebサーバのみで完結する簡単なチャットアプリを作ってみました。
自分用にアウトプットしたというのが主な目的なので説明はかなり雑な感じになっています。# フォルダ構成
以下作成したチャットアプリのフォルダ構成です。“`bash
.
├── go.mod
├── go.sum
├── lib
│ └── generator.go
├── main.go
├── model
│ ├── message
│ │ └── message.go
│ └── room
│ └── room.go
└── views
├── index.html
└── parts
└── message.html
“`## 実装
### ルーム
チャットルームは以下のような構造体で定義されていて、この構造体からルーム全体に broadcast したり、投稿されたメッセージを取得することができます。webs
GoLangとMailgunで実装する自動メール送信機能
# はじめに
この記事は自分がGolangとMailgunでメール送信サービスの実装をしたのでその流れを忘備録として残せたらと思って書いてます。加えて受託案件で自動メール送信機能を作ることはよくあると思うのですが、次のセクションで理由を記述しますが結構その時に自分と同じように困る人もいるかもと思ってこの記事を書いています。# SendGrid使えなかった
自分もそうだったのですが、メール送信サービスと聞くとSendGridを思い浮かべる人が多いと思います。なので今回のタスクがアサインされた際はSendGridを使おうと思っていました。しかし結論から言うとSendGridが使えませんでした。
なんとSendGridの利用規約に>システムの開発や運用を受託している企業が契約した場合、その使用権をクライアントに譲渡している、もしくは再販していることになります。
>そのため、メール送信者の立場にあたるクライアント企業に直接契約いただく必要があります。
>※開発から運用保守まですべてを請け負っている場合であってもクライアントにて契約いただく必要がありますとありました。つまりまとめると
無を犠牲にするfloatパーサーを作る
## はじめに
お久しぶりです。Sugawara Yuutaです。前の記事を書いてからもう5、6ヶ月も経っているのですね。
大変なことばかりでしたが、僕は先日無事に高校を卒業することができました。これからどうするかはぼやっとしか決まっていませんが、今からも少しずつ技術を磨いていこうと思います。
さて、今回はすでに投稿した記事とは一風変わって、文字列を浮動小数点数(英: floating-point number)へ変換するアルゴリズムの高速化に取り組んできました。
高校時代全くと言ってよいほどできなかった数学の学び直しも兼ねて行ったので、最後まで読んでいただけると嬉しいです。
## なぜ重要なのか…
floatは世界中で使われています。ただこの仕組みの基本的なアイディアはシンプルだというのに、floatから文字列に変換したり、その逆は任意精度の演算が必要になり、どうしても複雑になってしまいます。なによりこの動作は時間のかかるものであり、この数十年の間で開発されたアルゴリズムも数個しかありません。
これを少しでも高速化し、シンプルにすることが今回の目標です。そんなことできるのでしょう
【Go並行プログラミング】A Tour of Goの説明が頭に入らない人のためのゴルーチン&チャネル入門🌟
# はじめに
私はこれまでPython、JavaScript/TypeScript、PHPといった言語を中心にコーディングしてきました。しかし、仕事の都合上、Go言語の学習が必要になり、少しずつ学び始めてから3週間が経ちました。
2週目でポインタにつまづき、なんとか少し理解できるようになりました。そのときの学びログです。
https://qiita.com/s-kojima1227/items/cb8e0b99996fe71a237b
3週目に入り、今度は並行処理でこけました。なんとか少し理解できるようになったので、私と同じく並行処理が全然頭に入ってこない人に向けて、学びログを兼ねた記事を作成しました。
### 誰に向けた記事?
* 「A Tour of Go: Concurrency」に挑戦したが、説明が全く入ってこない人
* 一通りゴルーチンやチャネルについて学んだが、まだ学んだことを整理できていない人![huh.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1166480/a0ec
Go + Bun + Atlas でマイグレーション周りを自動化する
# はじめに
本記事は、以下二つの記事を大いに参考にさせて頂きました!🙏https://zenn.dev/yulog/scraps/94958b03abeb96
その上で、自分なりにカスタマイズした内容や、構築途中に詰まったところを記載していきたいと思います。
# 環境
– Go v1.20.0
– PostgreSQL v15
– Bun v1.1.17
– Atlas v0.19.0
– golang-migrate
– Docker
– makeディレクトリ構成はクリーンアーキテクチャ
# 最終的に実現したいこと
コマンド一発
go.modが作成されない🔰
“`
go mod init
go mod tidy
“`
上記コマンド実行後の結果です
“`
MacBook-puro todo_app % go mod initgo: cannot determine module path for source directory /Users/氏名/Desktop/未定義/todo_app (outside GOPATH, module path must be specified)
Example usage:
‘go mod init example.com/m’ to initialize a v0 or v1 module
‘go mod init example.com/m/v2’ to initialize a v2 module
Run ‘go help mod init’ for more information.
MacBook-puro todo_app % go mod tidy
“`
・解決
“`
go mod init 任意のモジュール名(部品名)go mod
Golangの構造体の初期化方法~FunctionalOptionパターン編~
Golangで構造体の初期化をしようとすると、しばし**FunctionalOptionパターン**というデザインパターンの記事を見かけます。
Javaで開発してきた人にとって構造体の初期化は**Builderパターン**を用いることが多いためあまり馴染みのない言葉なのではないでしょうか?今回はGolangの特性を活かした**FunctionalOptionパターン**が何なのか説明していきます。
# FunctionalOptionパターンとは
オブジェクトの構成や初期化時に柔軟性と読みやすさを提供するために使われるデザインパターンです。特にGo言語で広く利用されています。
**最大のメリットは、FunctionalOptionパターンを使用すると、クライアントコードは必要なオプションのみを指定して構造体の初期化をすることができる**ところにあります。
また**構成が非常にシンプルで、可読性が高い**といった特徴があります。# 基本的なアプローチ
結論としては以下のようなコードです。ユーザー情報の構造体を初期化する処理を想定したコードです。
実装手順については後ほど説明
Go言語の基礎 S2
# Go言語の文法
## 変数
### 型の種類
|型の名前|説明|サイズ|範囲|
|-|-|:-:|:-:|
|bool(boolen)|論理値型|1byte|“true“/“false“|
|string|文字列型|-|-|
|float32|単精度浮動小数点数|4byte|有効桁数6桁の実数|
|float64|倍精度浮動小数点数|8byte|有効桁数14桁の実数|
|int32|符号付き整数|4byte|-2147483648 ~ 2147483647|
|int64|符号付き整数|8byte|-9223372036854775808 ~ 9223372036854775807|
|int|符号付き整数|4byte / 8byte|“int32“または“int64“と同じ|
|rune|int32のエイリアス|4byte|Unicodeのコードポイント1文字分を格納|
|complex64|複素数|8byte|“float32“の実数部と虚数部を持つ複素数|
|complex128|複素数|16byte|“float64“の実数部と虚数部を持つ複素数
Go言語の基礎 S1
# Go言語の導入
これらの記事を書くにあったって、Go言語の初心者向けのサイトを作成してもらったすべての人に感謝を表し、これを謝辞とさせていただく。## Go言語の特徴
* コンパイル型言語
* 静的型付け言語
* 並行処理に強い
* C言語みたいに一文かいたらセミコロン(;)というのはない
* C言語などの言語と少し似ているため他の言語と少し似ている部分があり理解しやすい
* try-catchがない## 学習サイト
### A Tour of Go
https://go-tour-jp.appspot.com/list
Goの公式が出しているもの。日本語訳されていてすでに他の言語を触ったことがある人ならこれをすべき!!
### Progate(プロゲート)
https://prog-8.com/courses/go
他の言語を触ったことがない、または初心者の方はこのサイトから始めるとよいだろう。一部**有料**という欠点はあるが、わかりやすいのでおすすめである。
## Go言語の環境構築
https://go.dev/dl/
上記のサイトから環境にあった
はじめてのgRPC
業務で使う機会があり、ちゃんと理解したいなと思いやってみました。
## gRPCとは?
“`
Remote Procedure Call
“`
別の場所にある・別のサーバにあるProcedureを呼び出すものです。
それがRPCでそのRPCをGoogleが使えるようにしたものがgRPCです。## gRPCのメリットとは?
gRPCを使うかというと以下のようなメリットがあります。1\. 高性能と効率性
– Protocol Buffers(プロトコルバッファー)を使って通信をすることで高速に通信することができる
– JSONやXMLより軽量で速い
– HTTP/2を利用することでヘッダーの圧縮やストリームの多重化をすることができる2\. 言語とプラットフォームの独立
– 多数のプログラミング言語で利用可能
– なので、システム間の連携とかもしやすい3\. 強力な型付け
– プロトコルバッファーを使うことで型をちゃんとつけることができる4\. ストリーミングサポート
– 以下のようなストリーミング機能をサポートしている
– クライアントストリーミング
–
チャネル「右から、右から何かが来てる〜」
# 僕はそれを左へ受け流す〜
Go言語のチャネルの書き方を歌詞にした歌があったので紹介します。チャネルの使い方が覚えられない方の助けになれば幸いです。
“`go: チャネルの使い方
package mainimport (
“fmt”
)func main() {
ch := make(chan int)go func() {
// 右から、右から何かが来てる〜
ch <- 1 }() // 僕はそれを左へ受け流す〜 a := <-ch fmt.Printf("右から来て左に受け流されたもの 👉 %d\n", a) } ``` ```:出力 右から来て左に受け流されたもの 👉 1 ```
[Go]カバレッジ計測結果ファイルのデータサイズ抑制
# 問題
CircleCI で codecov の Orb([codecov/codecov](https://circleci.com/developer/ja/orbs/orb/codecov/codecov))を使い、go testでデフォルトのフォーマットで出力したカバレッジ計測結果のファイルをアップロードする際に、以下のようなエラーが発生していた。**CircleCIのログ**
“`
[yyyy-mm-ddTHH:MM:SS.SSSZ] [‘info’] Could not read coverage file (<カバレッジ計測結果のファイルパス>): Error: There was an error reading the coverage file: Error: Cannot create a string longer than 0x1fffffe8 characters
“`調査した結果、codecov の Orb は nodejs をベースにしているのだが、入力ファイル(=カバレッジ計測結果のファイル)を読み込んだ段階で [nodejs の文字列サ
Echoで固有リクエストヘッダ検証によるCSRF対策
## CSRF対策
CSRF対策で重要なのはユーザーが意図しない動作をブロックすることだと考えました。一般的なCSRF対策としてはCSRFトークンを利用したものがありますが、実装がうまくいきませんでした。色々試行錯誤してる中で、そもそもバックエンドとフロントエンドが独立したSPAでこれが適しているのかどうかという疑問も同時に持ちました。同じような問題の解決方法がMPAに限定されたものばかりだったためです。
https://echo.labstack.com/docs/middleware/csrfそこで調べているとバックエンドとフロントエンドが独立したSPAでは上の実装が困難であることを見つけ、下記ページで紹介されていた「固有のヘッダの有無を検証する」を試しました。
https://kimuson.dev/blog/フロントエンド/csrf_spa/## 実装
「固有のヘッダの有無を検証する」middlewareの実装。
middlewareの実装は試行錯誤していた時に見ていたechoの`csrf.go`を参考にしました。
https://github.com/labstack
【Go】rangefuncでループ終了後にfor文本体を呼び出すとエラーになる
# TL; DR
“`go
var f func(string) boolfunc capture(yield func(string) bool) {
f = yield
}func main() {
for s := range capture {
fmt.Println(s)
}
f(“foo”)
}
“`“`
panic: runtime error: range function continued iteration after exit
“`# はじめに
Go1.22のexperimentalの機能として、for文の `range` に関数が使用できるようになりました。
イテレータとして値を生成しながらループをする場合などに便利です。https://go.dev/wiki/RangefuncExperiment
“`go:
func main() {
// 関数が使える!
for i := range Fact {
if i > 1000000 {
break
}
fmt.Println(i)
}
}
【30歳/完全未経験/独学】webアプリを作製しました【Golang, Next.js, MySQL, Docker, GitHub Actions CI, AWS Fargate on ECS】
# V-kara開発
はじめまして。
IT業界未経験、プログラミング未経験の状態から独学でwebアプリを作製しました。
きっかけは趣味で使いたいアプリが無かったことです。
自分用に開発し始めてすぐにのめり込み仕事にしたいと思うようになり、一般向けに軌道修正してポートフォリオとしました。## 自己紹介
– 30歳男
– バックエンド志望
– 理系私大卒
– 生物化学系
コロナでお馴染みとなったPCRもやってました
– 職歴
– 排水処理の薬品・プラントで営業技術6年(mac)
– めっき薬品の営業技術2年(windows)
– 個人開発1年(一部在職中)
– 2023年末に退職
– ITの理解度
– 2年前まではjavaとjavascriptとHTMLの違いすら知りませんでした## ポートフォリオ
### 概要
– サイト:[V-kara](https://v-karaoke.com)
V-karaはVTuberの歌枠の歌情報を登録し、いつでも見返せるwebアプリです。
歌枠とは配信者がカラオケのように沢山歌う配信のことで、`どの配信の何分何秒に何を歌っ
A Tour of Goエラー:zsh: command not found: gotour
# 概要
A Tour of Goをスタンドアロンで動かそうとした時に出たエラーの解消方法について記載しています。
(所要時間1分)
![スクリーンショット 2024-03-02 16.27.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/8e357352-ce46-dd56-0c68-a91f018a6907.png)## 今回起きたエラー
記事に書いてある通りに下のコマンドを実行した時にエラーが出ました
“`
go tool tour
“`エラー:
![スクリーンショット 2024-03-02 16.29.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/d915dd23-8014-ac05-b1ed-365325ea70ff.png)## 解決方法
下のコマンドを実行
“`
# install
go install golang.org/x/website/tou
A Tour of Go: Equivalent Binary Trees の回答例
# はじめに
Go を学習し始めの時はあまり納得のいく回答ができなかったが、少し Go にも慣れてきて再度挑戦してある程度納得のいく回答ができたので書き留めます。
※ 実装には基本的な型のみを利用し、`context`といったものの利用は避けています# 問題の意図
問題文から読み取れる意図をまとめます。
問題文(もしくは Tree のドキュメント)には> 関数 tree.New(k) は、値( k, 2k, 3k, …, 10k )をもつ、ランダムに構造化 (しかし常にソートされています) した二分木を生成します。
と書かれているので生成される**必ず10個のノードを持つ二分探索木**となります。
実際、`tree` パッケージの `tree.New()` の実装を確認すると確かに10個の値を持つ二分探索木を作成していることがわかります。つまり、この問題では
– 生成される二分木は二分探索木である
– その二分探索木は必ず10個のノードを持つということを前提として処理を実装してみてくださいという意図があるのかなと思います。
“`go
func New(k i