- 1. [翻訳転載] Golang Tip #21: ポインタレシーバの推奨
- 2. [bbolt]Golangでembedded key value storeを使う
- 3. SQLBuilderの仕様を考える DELETE仕様検討編
- 4. SQLBuilderの仕様を考える UPDATE仕様検討編
- 5. GO+GinのAPI開発環境構築メモ
- 6. docconv良さげ: goのlangchainはpdfを読み込めないときがある
- 7. Goを用いてオニオンアーキテクチャを完全理解()したい。。。
- 8. [Go言語]Windows環境におけるOpenAPIによるGoコード自動生成方法 メモ
- 9. [翻訳転載] Golang Tip #22: 構造体やオプションパターンを使って関数のシグネチャをシンプルにする
- 10. 【Golang】無名関数に名前を付けて関数内関数として使う
- 11. Golang Tips
- 12. 【Golang】GORMでPostgres利用時のCreateをgo-sqlmockで単体テスト
- 13. Go言語におけるマルチバイト文字の扱い
- 14. Goでfirebaseのstorageに画像保存する処理を作った
- 15. Go&React(Next.js)環境をDockerで作る
- 16. Go REST API を作ってみる
- 17. Go でパッケージを自作して API を作ってみる:個人開発メモ
- 18. Goに入門
- 19. Go 1.22 で面白いと思ったアップデート
- 20. サポーターズ主催の技育CAMPに参加しての感想(企業賞受賞!) ③
[翻訳転載] 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 は見つけられなかった。もしご存じの方あればコメントいただけると嬉しいです。
| # | URL |
| –: | :– |
| 1 | [Measure the execution time of a function in just one line of code](https://x.com/func25/status/1725431804667244715?s=20) |
| 2 | [Multistage defer](https://x.com/func25/status/1726279577327342009?s=20) |
| 3 | [Pre-allocate slices for performance](https://x.com/func25/status/1727362895514943975?s
【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
Go言語におけるマルチバイト文字の扱い
Go言語はUnicodeテキストをネイティブにサポートしており、世界中のどの言語のテキストでも扱うことができます。これはstring型とrune型を通して実現されています。しかし、マルチバイト文字を扱う際にはいくつか注意点があります。
### string型
– string型はイミュータブル(変更不可能)で、UTF-8でエンコードされた文字列を保持します。
– string内の文字は直接インデックスを使ってアクセスすることができますが、これはバイト単位でのアクセスであり、マルチバイト文字を構成する個々のバイトに分割される可能性があります。
– string型はテキストデータの読み込み、保存、伝送に適していますが、マルチバイト文字を一文字ずつ処理する場合には不便な場合があります。### rune型
– rune型は、Unicodeのコードポイントを表すためのint32型のエイリアスです。これは、Go言語において1文字(Unicodeスカラー値)を表します。
– rune型を使うと、UTF-8エンコードされたマルチバイト文字列を構成する各文字に対して、そのUnicodeコードポイン
Goでfirebaseのstorageに画像保存する処理を作った
## はじめに
タイトルの通り、画像をアップロードする処理を作ったので、忘れないように残します。## 環境
– Go: 1.20.4
– echo: v4.10.2(あんまり関係ないですが一応)
– firebase: v4.13.0
– storage: v1.30.1## 前提
firebaseのプロジェクトは作成できている前提で進めます。
以下の公式の記事を参考に導入しました。https://firebase.google.com/docs/admin/migrate-go-v4?hl=ja
https://firebase.google.com/docs/storage/admin/start?hl=ja
また、今回の紹介でgormも登場自体はするのですが、今のアプリケーション内で使ってはいるものの、今回のケースには関係ないので無視してください。
## ディレクトリ構成
以下の構成で実装しました。“`
– sdk
– firebase
– storage.go // 画像処理周りのメインロジック
– firebas
Go&React(Next.js)環境をDockerで作る
## 目的
GoとReactの環境をdockerで作成
調べてみると、reactコンテナフォルダの中にReactプロジェクトフォルダが作成されて、そこにインストールされるという情報が多い。
しかし、プロジェクトフォルダが作成される場合、1階層深く潜らないといけないので、コンテナフォルダ直下にReactをインストールしたい。## Reactプロジェクト作成コマンド
“`sh
npx create-react-app my-app
“`my-appというフォルダが作成される。
このフォルダを作成したくない。:::note warn
※create-react-appは非推奨となっているそうです。
現在はフレームワークを利用してインストールすることが推奨されているようです。
:::※Reactはフレームワークではなく、JavaScriptライブラリー。
### Reactフレームワーク
https://ja.react.dev/learn/start-a-new-react-projectよく目にするのは、Next.js でしょうか。
“`sh
npx cr
Go REST API を作ってみる
GoでREST APIを作成する :baby_tone2:
下準備
“`bash
mkdir todo-go
cd todo-go
“`プロジェクト作成
“`bash
go mod init example/todo-go
“`パッケージ追加
“`bash
go get github.com/gin-gonic/gin
“`実行
“`bash
go run .
“`postmanの結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/e48231e6-4d54-8190-b5c6-cd4c1603d18c.png)## ソースコード
“`go
package mainimport (
“net/http”“github.com/gin-gonic/gin”
)type todo struct {
ID string `json:”id”`
Item string `json:”title”`
Go でパッケージを自作して API を作ってみる:個人開発メモ
更新:2024年2月13日
Go でパッケージを自作して API を作ってみます。# パッケージを自作して API を作成
フォルダ tmp20240213 を作って、その下に main フォルダ作ります。そして main.go を作って、 go mod init と go mod tidy します。
“`:Macbook Terminal
% pwd
/***/tmp20240213/main
% go mod init tmp20230213/main
go: creating new go.mod: module tmp20230213/main
go: to add module requirements and sums:
go mod tidy
% go mod tidy
% ls
go.mod main.go
“`“`:test20240202/main/main.go
package mainimport (
“net/http”
“tmp20240213/handler”
)func main() {
http.HandleFunc(
Goに入門
サーバー作りたいので`Go`で書いてみる:grinning:
まずは`Go`の基本的な書き方を確認:star:## 実行
`.go`のあるフォルダでコマンド実行
“`
go run .
“`## エントリーポイント
`main`関数が`Go`のエントリーポイントとなる
“`go
package mainimport “fmt”
func main() {
fmt.Println(“hello world”)
}
“`
## パッケージ
標準ライブラリをパッケージとして読み込んで使う(多分:baby_tone2:)
[Standard library](https://pkg.go.dev/std)に色々載ってる
“`go
import “fmt”
“`複数を読み込むときの書き方
“`go
// 一つずつ宣言しても良い
import “fmt”
import “reflect”import (
“fmt”
“reflect”
)
“`## 数値型
“`go
var num int
num = 1
num1 := 1n
Go 1.22 で面白いと思ったアップデート
# 概要
フューチャーのブログを読んでGo 1.22 についてのアップデートを読んでいて面白かった、すぐに利用できる部分のピックアップです。基本的にフューチャーのブログを参考にしていますので興味有る方は元記事読んでみてください!
追記:🚩 2024/02/07 リリースされました
https://go.dev/blog/go1.22# slice を連結する `Concat()` API が追加になった
refs: https://future-architect.github.io/articles/20240130a/
更新PR: ([#56353](https://github.com/golang/go/issues/56353))“` go
result := append(n1, append(n2, n3…)…)
“`
↓
“` go
result := slices.Concat(n1, n2, n3)
“`で書けるようになった!:+1:
## 空スライスやnil のときはどうなる?
Golang ではスライスは参照型であり n
サポーターズ主催の技育CAMPに参加しての感想(企業賞受賞!) ③
—
サポーターズ主催の技育CAMPに参加しての感想 ③
—**ダース・ベイダーサイド**
正直スターウォーズは見たことがない。
見ようとは思っているが時間がない。
だがダース・ベイダーは知っている。
なんか黒いやつだ。
多分、ラスボスだ。
なんとなくデータベースと語感が似ている。
多分なんか保管してくれるんだろう。
あとアース・ネイチャーにも似ている。
多分蚊を亡きモノにしてくれるんだろう。
あとナイスネイチャにも似ている。
多分可愛いんだろう。
まとめると
ダース・ベイダーは
黒くて、なんか保管する、蚊をやっつける可愛いラスボスなのです。多分。
**目次**
– [1. ハードサイド](#1-ハードサイド)
– [2. データベースサイド](#2-データベースサイド)
– [3. おわりに](#3-おわりに)## 1. ハードサイド
**ラズベリーパイを使用した傾斜検知システムの開発**
OTHERカテゴリの最新記事
-
- 2024.09.19
JavaScript関連のことを調べてみた
-
- 2024.09.19
JAVA関連のことを調べてみた
-
- 2024.09.19
iOS関連のことを調べてみた
-
- 2024.09.19
Rails関連のことを調べてみた
-
- 2024.09.19
Lambda関連のことを調べてみた
-
- 2024.09.19
Python関連のことを調べてみた