- 1. [翻訳転載] Golang Tip #22: 構造体やオプションパターンを使って関数のシグネチャをシンプルにする
- 2. 【Golang】無名関数に名前を付けて関数内関数として使う
- 3. Golang Tips
- 4. 【Golang】GORMでPostgres利用時のCreateをgo-sqlmockで単体テスト
- 5. Go言語におけるマルチバイト文字の扱い
- 6. Goでfirebaseのstorageに画像保存する処理を作った
- 7. Go&React(Next.js)環境をDockerで作る
- 8. Go REST API を作ってみる
- 9. Go でパッケージを自作して API を作ってみる:個人開発メモ
- 10. Goに入門
- 11. Go 1.22 で面白いと思ったアップデート
- 12. サポーターズ主催の技育CAMPに参加しての感想(企業賞受賞!) ③
- 13. [GCP, Go]Spanenr公式ライブラリのまとめ
- 14. Next.jsのBFFから画像を送信したら届きそうで届かなかった話
- 15. Go言語における環境変数使い方: osパッケージ
- 16. About Composition as Code
- 17. docker initでDocker環境構築
- 18. SQLBuilderの仕様を考える INSERT仕様検討編
- 19. GCPインスタンスでのheyインストール方法
- 20. サポーターズ主催の技育CAMPに参加しての感想(企業賞受賞!) ②
[翻訳転載] 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. ハードサイド
**ラズベリーパイを使用した傾斜検知システムの開発**
[GCP, Go]Spanenr公式ライブラリのまとめ
ざっくり思い出すときの自分用メモ。詳細はリファレンスを参照。
# 1. DBのCREATE, DROP, LIST, DBスキーマの更新
– `google-cloud-go.spanner.admin.database.apiv1` パッケージ の `DatabaseAdminClient` を使うDBを作成後、テーブルも即座に作成する[公式のサンプルコード](https://cloud.google.com/spanner/docs/getting-started/go?hl=ja#create_a_database) 。
コメント付与してみた。
“`sample.go
import (
“context”
“fmt”
“io”
“regexp”database “cloud.google.com/go/spanner/admin/database/apiv1”
adminpb “google.golang.org/genproto/googleapis/spanner/ad
Next.jsのBFFから画像を送信したら届きそうで届かなかった話
![Screenshot 2024-02-13 at 17.59.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2373655/a15bd053-4fb8-1914-8c5d-bd3b5fd9fdeb.png)
# この記事を読んだ方がいい人
Javascriptに不慣れな人。
HTMLで当たり前のように遅れていた画像がBFFを通したら送れなくて困っている人
# この記事を読まない方がいい人
コーディングとネットワーク領域の両方に自信があるひと
# やりたかったこと
Next.jsで作ったフロントアプリケーションにて画像登録のフォームを作成した。
バックエンドAPIはGoで作ってある
# はまったポイント
BFFで画像をハンドリングする処理がうまくいかない。
## そもそもフォームデータって
フォームって一言で言っても画面UIとしての入力フォーム的なこととも言えるし、もう少し物理層チックなことを言ってそうな気もしますが、今回はHTTP通信においてのテキストとしてのフォームの
Go言語における環境変数使い方: osパッケージ
環境変数は、オペレーティングシステムにおける動作環境を定義するキーと値の組み合わせです。Go言語を用いたアプリケーション開発では、環境変数を活用することで、デプロイメントの柔軟性を向上させ、設定値を外部から注入することが可能になります。
Go言語の標準ライブラリであるosパッケージは、環境変数を操作するための関数群を提供しています。
### Getenvで環境変数の取得
`os.Getenv()` 関数を使用して、特定の環境変数の値を取得します。
“`go
package mainimport (
“fmt”
“os”
)func main() {
// “HOME” 環境変数の値を取得
home := os.Getenv(“HOME”)
fmt.Println(“Home directory:”, home)
}
“`
このコードスニペットは、ユーザーのホームディレクトリパスを表すHOME環境変数の値を取得し、出力します。### LookupEnvで環境変数の取得
`os.LookupEnv()`関数は、`os.Get
About Composition as Code
CaC (Composition as Code) について。
https://www.infoq.com/jp/articles/cloud-computing-post-serverless-trends/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global
> Infrastructure as CodeからComposition as Codeへと移行する大きなトレンドがあり、開発者は使い慣れたプログラミング言語を使用して、より直感的なクラウドサービスの設定ができる。
アプリケーションとインフラの責任の境界が曖昧になる中で CaC は次の paradigm になるかもしれない。
Cloud Development Kit for Terraform (CDKTF)[^1] について unlearn する。
## Environment
– Devcontainer で構築。https://github.com/danny-yamamoto/cdktf-gke/blo
docker initでDocker環境構築
`docker init`で`Go`の`dockerfikle`を作って、中身を確認してみよう:eyes:
## docker init
対話形式で設定を決めていくスタイルなので、オプションを覚えなくても使えそう
“`bash
PS C:\Users\xxx\Documents\go-app> docker initWelcome to the Docker Init CLI!
This utility will walk you through creating the following files with sensible defaults for your project:
– .dockerignore
– Dockerfile
– compose.yaml
– README.Docker.mdLet’s get started!
? What application platform does your project use? [Use arrows to move, type to filter]
? What application
SQLBuilderの仕様を考える INSERT仕様検討編
# 目的
GolangのSQLBuilerを作ってみたくて、仕様を考える。
今回はINSERT文の仕様を考えるが、SELECT+INSERTまで考えると複雑になるので
一旦保留にする# 目指す形
ここでは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)
)
“`
を想定する## Insert
パッケージ名は仮でpkとして
“`go
pk.Insert().Into(pk.Table(“users”)).Value(1, “test”)// INSERT INTO users VALUES(1, ‘test’)
“`とすることを考えている。
カラムを限定する場合は
“`go
pk.Insert(“id”).Into(
GCPインスタンスでのheyインストール方法
## 概要
– GCPのインスタンスにheyをインストールする方法です。
– heyとは
– heyは、Go言語で書かれたHTTP負荷テストツールです。## 参考URL
– [hey](https://github.com/rakyll/hey)
– [Goの最新バージョン](https://go.dev/dl/)
– 2024年2月時点での最新バージョンは、go1.22.0です。## 環境
– GCPのComputeEngineなどのVMインスタンス。
– OSはDebian系(Ubuntu, Debian, etc)を想定。## 事前準備
– 事前にGCPのインスタンスを作成しておく。
– インスタンスにSSHでログインしておく。
– マネジメントコンソール > ComputeEngine > VMインスタンス > SSHをクリックすると、SSHでログインできます。## インストール手順
– SSHで接続したターミナルで以下のコマンドを実行します。
– Goのインストール
“`bash
wget https://dl.goo
サポーターズ主催の技育CAMPに参加しての感想(企業賞受賞!) ②
—
サポーターズ主催の技育CAMPに参加しての感想 ②
—**博多華丸・大吉**
_スピーチとスカートは短い方が良い_
などと言われますが
_スライドとフライドも短い方が良い_
と私は思います。
スライドは短くシンプルに、フライドは軽くサクッと。
今回のハッカソンと、その後の打ち上げのソーセージフライドを食べて、そう感じたんですよね。
ま、私は発表の時、あがっていたんですけどね。
フライドだけに。
**目次**
– [1. 実装内容](#1-実装内容)
– [2. 背景・経緯](#2-背景経緯)
– [3. サーバーサイド](#3-サーバーサイド)
– [4. おわりに](#4-おわりに)## 1. 実装内容
[前回](https://qiita.com/come/items/40f778f59081118cd6f0)の続きです。
私たちが今回実装したのは『鍵の観測者(オブザーバー)』というサービスです。
これは「家などの鍵の締め忘れをすぐに通知し、戸締りを見張ってくれる