- 1. [翻訳転載] Golang Tip #5: メソッドチェーン
- 2. [翻訳転載] Golang Tip #4: 配列をスライスにパースする
- 3. [翻訳転載] Golang Tip #3: パフォーマンスを考慮したスライスの初期化
- 4. [翻訳転載] Golang Tip #1: 1行のコードで関数の実行時間を計測する
- 5. Ubuntuでaptを用いずGoインストール
- 6. [翻訳転載] Golang Tip #2: Golang Tips #2: マルチステージdefer
- 7. HugoでWEBサイトを秒で構築する
- 8. なぜGo言語のマスコットはGopherなのか
- 9. [翻訳転載] Golang Tip #21: ポインタレシーバの推奨
- 10. [bbolt]Golangでembedded key value storeを使う
- 11. SQLBuilderの仕様を考える DELETE仕様検討編
- 12. SQLBuilderの仕様を考える UPDATE仕様検討編
- 13. GO+GinのAPI開発環境構築メモ
- 14. docconv良さげ: goのlangchainはpdfを読み込めないときがある
- 15. Goを用いてオニオンアーキテクチャを完全理解()したい。。。
- 16. [Go言語]Windows環境におけるOpenAPIによるGoコード自動生成方法 メモ
- 17. [翻訳転載] Golang Tip #22: 構造体やオプションパターンを使って関数のシグネチャをシンプルにする
- 18. 【Golang】無名関数に名前を付けて関数内関数として使う
- 19. Golang Tips
- 20. 【Golang】GORMでPostgres利用時のCreateをgo-sqlmockで単体テスト
[翻訳転載] Golang Tip #5: メソッドチェーン
# はじめに
https://qiita.com/a10a/items/5063899c9f4a3bf4a2f2
本記事は以下のツイートの翻訳転載です。
https://x.com/func25/status/1728354658673135697?s=20
メソッドチェーンについての内容になります。
# メソッドチェーン
メソッドを定義する場合、レシーバをそのまま返してください。
![image](https://pbs.twimg.com/media/F_xXycNbIAEeZXb?format=jpg&name=medium)
これはメソッドチェーンとして知られています。
複数のメソッドを流れるように連続して呼び出すことができる方法を実現することができ、クリーンで効率的なコードを生み出すことができます。![image](https://pbs.twimg.com/media/F_xZWsXbUAArmOe?format=jpg&name=medium)
# おわりに
個人の感想ですが、メソッドチェーンを設計できていると「お、できるやつだ」ってなります。
[翻訳転載] Golang Tip #4: 配列をスライスにパースする
# はじめに
https://qiita.com/a10a/items/5063899c9f4a3bf4a2f2
本記事は以下のツイートの翻訳転載です。
https://x.com/func25/status/1727651590667158013?s=20
スライスを配列にパースする方法についての内容になります。
(記事タイトルは転載元Post(`Parse an Array into a Slice`)より)# 配列をスライスにパースする
`copy()`を検討しますよね。
![image](https://pbs.twimg.com/media/F_nWt6qawAA1dkl?format=jpg&name=medium)
しかし、これは冗長です。
もしプロジェクトがGo 1.20にアップデートされていれば、より簡単にパースすることができます。
他の型のパース(例えば`int`から`int32`)と同様です。![image](https://pbs.twimg.com/media/F_nXliRaoAAAgLk?format=jpg&name=medium
[翻訳転載] Golang Tip #3: パフォーマンスを考慮したスライスの初期化
# はじめに
https://qiita.com/a10a/items/5063899c9f4a3bf4a2f2
本記事は以下のツイートの翻訳転載です。
https://x.com/func25/status/1727362895514943975?s=20
スライスの初期化についての内容になります。
# パフォーマンスを重視したスライスの初期化[^1]
[^1]: `pre-allocation`
なぜパフォーマンスを考慮する必要があるのかについては次のPostを参照してください。
https://x.com/func25/status/1727363227749961777?s=20
以前は、`make(a, 10)` を使って初期化していました。
が、結果的に先頭に意図しないゼロを大量に含んでしまう`append()`(画像参照)を頻繁に手癖で書いてしまっていました。
これを避けるために、現在ではより効果的な初期化の方法である `make(a, 0, 10)` を使うようにしています。
![image](https://pbs.twimg.com/medi
[翻訳転載] Golang Tip #1: 1行のコードで関数の実行時間を計測する
# はじめに
https://qiita.com/a10a/items/5063899c9f4a3bf4a2f2
本記事は以下のツイートの翻訳転載です。
https://x.com/func25/status/1725431804667244715?s=20
[Tip #2のマルチステージdefer](https://qiita.com/a10a/items/890dee753883decbfd42)を使用する方が良いと思う。
このPostをした後に改善版としてTip #2をPostしたのかもしれない
# Golang #1: 1行のコードで関数の実行時間を計測する
![image](https://pbs.twimg.com/media/F_H3DlDasAA_9SH?format=jpg&name=medium)
Ubuntuでaptを用いずGoインストール
[CircleCIのcimg-go](https://github.com/CircleCI-Public/cimg-go/blob/main/1.22/Dockerfile)や、公式の[インストール手順](https://go.dev/doc/install)を参考に作成。
Install:
“`sh
## バージョン情報を記載
$ GO_VER=”1.22.0″
$ ARCH=”amd64″## ダウンロード
$ curl -sSL “https://go.dev/dl/go${GO_VER}.linux-${ARCH}.tar.gz” | sudo tar -xz -C /usr/local/## PATHを通す
$ echo ‘export PATH=$PATH:/usr/local/go/bin’ >> ~/.bashrc
$ echo ‘export PATH=”$(go env GOPATH)/bin:$PATH”‘ >> ~/.bashrc$ source ~/.bashrc
## 動作確認
$ go version
go version go1.
[翻訳転載] Golang Tip #2: Golang Tips #2: マルチステージdefer
# はじめに
https://qiita.com/a10a/items/5063899c9f4a3bf4a2f2
本記事は以下のツイートの翻訳転載です。
https://x.com/func25/status/1726279577327342009?s=20
`defer`を工夫すると呼び出し時とdefer時(これをなんて言うかわからない)の処理を1つの関数で書くことができる、という内容になります。
個人的にはなるほど確かに賢いな、と思う反面、メインの処理で`defer`を見た時に考慮すべきことが増えそうなので、濫用すべきではないかと思いました。
後続のPostに投げられている実行時間計測では便利のかも、と思いつつ、計測開始タイミングは指定できる一方計測終了タイミングは`defer`のタイミングでしかないので使いづらいのでは、と思ったり。
![image](https://pbs.twimg.com/media/F_T6MCQaUAAEHN9?format=jpg&name=medium)
# Golang Tips #2: マルチステージdefer
`defer`だ
HugoでWEBサイトを秒で構築する
# Hugoとは
https://gohugo.io/
ウェブサイトを構築するための世界最速のフレームワーク。
[Hugo](https://github.com/gohugoio/hugo) はGoのプロジェクトの中で、6番目にスターが多いプロジェクトである。テーマなど静的サイトのカスタマイズが、簡単に行うことができる。# インストール
https://gohugo.io/installation/ で各々の環境に合ったものをダウンロードできる。
Macの場合だとbrewで以下のようにダウンロードできる。
“`
brew install hugo
“`# サイトの作成
プロジェクトを作成する。
“`shell-session
$ hugo new site mysite
“`すると、以下のようなmysiteディレクトリが作られる。
“`
mysite
├── archetypes
│ └── default.md
├── assets
├── content
├── data
├── hugo.toml
├── i18n
├── layou
なぜGo言語のマスコットはGopherなのか
—
なぜGo言語のマスコットはGopherなのか
—**ネズミ**
青いネズミって
青い猫のドラえもんとなんか対比されてそうですよね。
Gopher君にも悲しい過去があるのかも……。
**目次**
– [1. Gopherの起源](#1-gopherの起源)
– [2. ミネソタ大学とGopher](#2-ミネソタ大学とgopher)
– [3. おわりに](#3-おわりに)## 1. Gopherの起源
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493200/4b4800bd-18cc-a03b-cf51-66743bef5073.png)
designed by [Renée French](http://reneefrench.blogspot.jp/).**はじめに**
Go言語(通称Go)は、Googleによっ
[翻訳転載] Golang Tip #21: ポインタレシーバの推奨
# はじめに
https://qiita.com/a10a/items/5063899c9f4a3bf4a2f2
本記事は以下のツイートの翻訳転載です。
https://x.com/func25/status/1758085077211443304?s=20
値レシーバ、またはポインタレシーバのどちらを選択すべきか、という内容になります。
“`go
// 値レシーバ
func (c Cat) meow() { … }// ポインタレシーバ
func (c *Cat) meow() { … }
“`個人的にはこの辺よくわかっていないので、とりあえずポインタレシーバを使ってきました。
が、このTipを読んでもあんまり腹落ちした感じではないです。多分実際に「ああここは値レシーバ/ポインタレシーバを使っておくべきだった」という体験が無いからかなと思います。
# Golang Tip #21: ポインタレシーバの推奨
以下リンクはポインタレシーバと値レシーバについての簡単な説明です。
– https://twitter.com/func25/status/1
[bbolt]Golangでembedded key value storeを使う
## 概要
bblotを使ってDisk based key/value storeを構築する
https://github.com/etcd-io/bbolt
## 背景
– サーバに積むメモリを最小限に抑えるため、インメモリではなくでDisk based key/value storeを利用したい
– mmapを利用して自作しようと思ったが考慮することが多かったためあきらめた
– embedded key/value storeといえば、[RocksDB](https://rocksdb.org/)が思いつくが、Goでの組み込みが大変そうだった
– 「golang embeded key value store」で検索すると、多くの人がbboltを使っていたので利用することに決定
– この辺とかhttps://www.reddit.com/r/golang/comments/rrccjq/recommendation_for_keyvalue_storage/?rdt=58913## ユースケース
– ユーザー検索文字列をシノニム展開する
– 以下のようなシノニム辞
SQLBuilderの仕様を考える DELETE仕様検討編
# 目的
GolangのSQLBuilerを作ってみたくて、仕様を考える。
今回はDELETE文の仕様を考える。また、TRUNCATEも併せて考える。# 目指す形
ここではusersというTableに対応したUserというTableモデル構造体がある場合とする。
宣言としては、
“`
CREATE TABLE users (
id int,
name varchar(10)
)CREATE TABLE tokens (
id int,
user_id int REFERENCES users.id,
token varchar(10)
)
“`
を想定する## DELETE
パッケージ名は仮でpkとして
“`go
pk.DELETE(pk.Table(“users”))// DELETE FROM users
“`とすることを考えている。
WHERE句の利用は
“`go
pk.DELETE(pk.Table(“users”)).WHERE(pk.Eq(“users.id”), 1)// DELETE FROM users W
SQLBuilderの仕様を考える UPDATE仕様検討編
# 目的
GolangのSQLBuilerを作ってみたくて、仕様を考える。
今回はUPDATE文の仕様を考える。# 目指す形
ここではusersというTableに対応したUserというTableモデル構造体がある場合とする。
宣言としては、
“`
CREATE TABLE users (
id int,
name varchar(10)
)CREATE TABLE tokens (
id int,
user_id int REFERENCES users.id,
token varchar(10)
)
“`
を想定する## Update
パッケージ名は仮でpkとして
“`go
pk.Update(pk.Table(“users”)).Set(“name”, “test”)// UPDATE users set name = ‘test’
“`とすることを考えている。
複数カラムに関しては
“`go
pk.Update(pk.Table(“users”)).Set(“id”, 2).Set(“name”, “test”)//
GO+GinのAPI開発環境構築メモ
# 背景
毎回、GoとGinによるAPIの環境構築の手順を忘れるので、ここに備忘録として残します。# 環境
OS: macOS 13.6.4(22G513)
チップ:Apple M2 Pro
GOバージョン:go1.21.3# 手順
## 1. GOのインストール
こちらのサイト(https://go.dev/doc/install) を参考にインストールしてください。## 2. プロジェクト用のディレクトリを作成
以下のコマンドを使って任意の場所にプロジェクト用のディレクトリを作成して移動します。
“`.zsh
mkdir back
cd back
“`
## 3. goをinitする
以下のコマンドを使って、GOのmodファイルを作成します。
`{モジュール名}`は適当で良いです。
“`.zsh
go mod init {モジュール名}
“`
すると、以下のように表示されます。
“`.zsh
go: creating new go.mod: module {モジュール名}
“`## 4. ginをインストールする
以下のコマンドを使って、ginに必要なも
docconv良さげ: goのlangchainはpdfを読み込めないときがある
# 問題
– GPT Plugin開発中で使ってる
– [langchaingo](https://github.com/tmc/langchaingo)のPDF読み込み機能
– 正常に読み込めるファイルと読み込めないファイルがある“`go:コード例
f, _ := os.Open(“test.pdf”)
defer f.Close()
finfo, _ := f.Stat()
loader := documentloaders.NewPDF(f, finfo.Size())
docs, err := loader.Load(cxt)// 期待値ページ区切りの文章の配列
// docsが空の時がある
fmt.Printf(“docs: %v\n”, docs)“`
# 解決方法
– [docconv](https://github.com/sajari/docconv)を使ってPDFをテキストに変換
– textsplitteerでテキストをN文字単位(400)で分割
– 実行環境の読み込みツールを利用するので, pc, 本番, dockerで環境の設定をする必要
Goを用いてオニオンアーキテクチャを完全理解()したい。。。
# はじめに
こんにちは、H×Hのセンリツ大好きエンジニアです。
オニオンアーキテクチャをGoで実装してみたので、ご紹介します。
涙なしでは語れない深い理解()を目指しますが、その涙は感動か、それともオニオン(玉ねぎ)のせいかは、読み終わる頃にはわかるはずです。# オニオンアーキテクチャとは?
ソフトウェアアプリケーションの設計パターンの一つで、アプリケーションを複数の層に分けることによって、依存関係を管理しやすくする設計方法です!
### メリット
1. **強固な依存性の管理**
2. **高いテスト容易性**
3. **柔軟なフレームワークとの結合**
4. **ドメイン中心の設計**
5. **分離された懸念事項**## オニオンアーキテクチャの構造
1. **ドメインモデル層(Entity)**:ビジネスロジックやビジネスルールを表す
2. **アプリケーション層(Usecase)**:アプリケーションのユースケースやビジネスケースを実装する
3. **ドメインサービス層**:複数のドメインモデル間で行われる操作を実装する
4. **インフラストラクチャ層(Infr
[Go言語]Windows環境におけるOpenAPIによるGoコード自動生成方法 メモ
## 概要
– Windows環境においてOpenAPI Generatorを用いたGoコード生成方法についてメモする。
## 手順
### Scoopインストール
Windows用パッケージマネージャー`Scoop`をインストールする。
“`shell
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression
“`### OpenAPI Generatorインストール
OpenAPI Generatorをインストールする。
“`shell
scoop install openapi-generator-cliscoop bucket add java
scoop install openjdk
“`### テスト用OpenAPI yaml(petstore.yaml)の取得
* PetstoreのOpenAPI仕様ファイル(`petstore.yaml`
[翻訳転載] Golang Tip #22: 構造体やオプションパターンを使って関数のシグネチャをシンプルにする
https://qiita.com/a10a/items/5063899c9f4a3bf4a2f2
本記事は以下のツイートの翻訳転載です。
💡 Golang Tip #22: Simplify function signatures with structs or variadic options
When designing functions in Go, we might encounter the need to pass numerous parameters.
This can cloud the function's purpose and make maintaining code a chore, especially when parameters of the… pic.twitter.com/475kPmifHp
— Phuong Le (@func25) February 16, 2024
関数に多くの引数を渡したい場合どうするか、という内容になります。
2つのパターンが紹介されていますが、確かにどちらもよく見るなという印象です。
– 構造体を使用している例
– https://github.com/aws/aws-cdk-go/blob/30a57af20b54b95225aecf6741db20d30d72622a/awscdk/awsssm/StringParameter.go#L191-L206
– オプションパターンを使用している例
– https://github.com/go-kit/kit/blob/844c3d2de01a7fee4cfda9981edad4d58103130e/transport/http/server.go#L13-L92## Golang Tip #22:
【Golang】無名関数に名前を付けて関数内関数として使う
【Golang】無名関数に名前を付けて関数内関数として使う
# 概要
どうしても関数内で関数を定義したい場合のやつ# モチベーション
関数は大きくても小さくても使いづらい(個人談)
関数内で少しまとめたい機能だけど外に括り出すほどではない、
けど関数内で何回か使う
そんな機能を関数内に関数として定義したかった
(所謂 module 内の function みたいなもの)# 結論コード
“` main.go
package mainimport (
“os”
“strconv”
)func main() {
parsi := func(cstrv string) int {
i64v, _ := strconv.ParseInt(cstrv, 10, 32)
return int(i64v)
}cv1 := parsi(os.Args[1])
cv2 := parsi(os.Args[2])println(cv1, “+”, cv2, “=”, calcAdd(cv1, cv2))
}func calcAdd(inp1, inp2
Golang Tips
[Phuong Le](https://twitter.com/func25)によるGolang Tips
Xを徘徊していて有益そうなPostを見かけたのでまとめておく。ちゃんと読んだら別記事で翻訳しながら勉強したいと思っている。
#8, #10, #11, #24 は見つけられなかった。もしご存じの方あればコメントいただけると嬉しいです。
| # | URL |
| –: | :– |
| 1 | [[翻訳転載] Golang Tip #1: 1行のコードで関数の実行時間を計測する](https://qiita.com/a10a/items/96cabcdcf60481480145) |
| 2 | [[翻訳転載] Golang Tip #2: マルチステージdefer](https://qiita.com/a10a/items/890dee753883decbfd42) |
| 3 | [[翻訳転載] Golang Tip #3: パフォーマンスを考慮したスライスの初期化](https://qiita.com/a10a/items/6945dbafbff7a8f80365
【Golang】GORMでPostgres利用時のCreateをgo-sqlmockで単体テスト
# はじめに
近年WEBアプリケーションのバックエンドAPIにGolangを採用することが増えている。それに伴いGORMをORマッパーに採用することも少なくないだろう。
本記事ではデータベースにPostgresを採用時、GORMで実装したInfrastructure層のCreate関数を単体テストする。# Domain層
Infrastructure層の単体テストを行うにあたり、本記事で利用するリソースの抜粋を以下に示す。
“`golang: domain/user.go
type User struct {
gorm.Model
Name string `gorm:”not null”`
Email string `gorm:”uniqueIndex;not null”`
}type UserRepository interface {
Create(*gorm.DB, *User) error
}
“`# Infrastructure層
今回単体テストを行うCreate関数を以下に示す。
“`golang: infrast