- 1. [Go] 並行処理を30分で理解?
- 2. Dockerで開発環境構築(GIN(GO)+Air)
- 3. Goでポインタを使うのか値を使うのかで迷ったこと
- 4. 【個人開発】初心者がもんたの森というな無料画像サイトを作った話
- 5. わたしとゴリラとジンと
- 6. AWS+Lambda+API+GOでオウム返しLine Bot
- 7. GoとReactでAPI通信
- 8. [翻訳転載] Golang Tip #5: メソッドチェーン
- 9. [翻訳転載] Golang Tip #4: 配列をスライスにパースする
- 10. [翻訳転載] Golang Tip #3: パフォーマンスを考慮したスライスの初期化
- 11. [翻訳転載] Golang Tip #1: 1行のコードで関数の実行時間を計測する
- 12. Ubuntuでaptを用いずGoインストール
- 13. [翻訳転載] Golang Tip #2: Golang Tips #2: マルチステージdefer
- 14. HugoでWEBサイトを秒で構築する
- 15. なぜGo言語のマスコットはGopherなのか
- 16. [翻訳転載] Golang Tip #21: ポインタレシーバの推奨
- 17. [bbolt]Golangでembedded key value storeを使う
- 18. SQLBuilderの仕様を考える DELETE仕様検討編
- 19. SQLBuilderの仕様を考える UPDATE仕様検討編
- 20. GO+GinのAPI開発環境構築メモ
[Go] 並行処理を30分で理解?
# Goroutinesってなに?
[educative](https://www.educative.io/answers/what-is-a-goroutine)には、以下のように書いてあります。
>ゴルーチンとは、Goプログラミング言語における軽量の実行スレッドであり、プログラムの他の部分と同時に実行される関数です。
ゴルーチンは、従来のスレッドと比較すると、ゴルーチンを作成するオーバーヘッドが非常に小さいため、驚くほど安価です。そのため、Goでは並行プログラミングに広く使われています。
関数をgoroutineとして呼び出すには、goキーワードを使用します。なるほど、わからん。まぁとりあえず、 **同時に実行される** ということですね。
# コードのテンプレート
2つの関数 **`heyko1()`** と **`heyko2()`** が同時に実行される(並行処理される)ための関数 **`main()`** を作成します。goroutinesを呼び出すときには、基本的には呼び出すところで関数の前に`go`をつけることで並行処理として利用できます。これだけ
Dockerで開発環境構築(GIN(GO)+Air)
# はじめに
初めまして!
エンジニアになって数年、今まで本を読むだけでしたが、もっとプライベートで楽しみながら成長したい!自分が学んだ足跡を残していきたい!と思い記事をかきました!
最終的には自在に開発できるようになりたいと思っています。:triumph:
いろいろな記事を参考にさせてもらっています。:bow_tone2:
その中でもこれってどういう意味?とかつまづいたところを念入りに書いていこうかと思います。:fist:# 今回の目的
友人と進めているアプリ開発でGINを使おうって話が上がりました!折角だからDockerで立ち上げたろう、と思ったのでイチからどう進めていったか書いていきます!# 使用したものや事前準備
・Macbook Pro
・GIN(GO)
・Air
・Docker# 主に参考にさせていただいた記事
https://go.dev/doc/tutorial/getting-startedhttps://gin-gonic.com/ja/docs/quickstart/
https://kakakakakku.hatenablog.com/ent
Goでポインタを使うのか値を使うのかで迷ったこと
## はじめに
タイトルの通りです。
実際の業務の中で、ポインタの使いをなんとなくでやってたなとおもい、まとめてみました。
また、ケースの紹介の箇所はプロジェクトのルールや方針等もあると思うので、
あくまで私の理解と私の経験だと理解してください。## ポインタって?
ポインタはメモリのアドレスを指します。
ポインタは「値がどこにあるのか」を示すもので、値自体ではありません。
Go言語では以下のようにポインタを使用できます。
“`go
package mainimport “fmt”
type Fruits struct {
Name string
Color string
}func main() {
// Fruitsをポインタ型でappleに使用する
apple := &Fruits{
Name: “りんご”,
Color: “red”,
}fmt.Printf(“apple :%+v\n”, apple)
fmt.Printf(“appleに格納されているアドレス :%p\n”, apple)
}
“`
実行結果“`
app
【個人開発】初心者がもんたの森というな無料画像サイトを作った話
はじめまして!もんたです。
最近、趣味で作った『**もんたの森**』っていう無料で画像を保存したりコピーしたりできるサイトを作ったので、学んだことのアウトプットとしていろいろ話していきます!
初心者の人がこの記事見て個人開発にチャレンジしてもらえればなと思います!
あ、そういえばいろいろやらせてもろてます。
よかったら覗いてみてあげてください。**【最近始めたnote】**
趣味で読んだ本について書いてますhttps://note.com/kadota0706
**【あまり使っていないX(Twitter)】**
描いた絵をシェアしたりしてます# 今回作ったやつ
https://montanomori.com/![vpd3o-h3ckx.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2038763/e0aee1ad-7a93-f337-df96-fde8acbb919e.gif)
# 背景
時は
わたしとゴリラとジンと
—
わたしとゴリラとジンと
—**ゴリラ・ゴリラ・ゴリラ**
エンジニアはB型が多いらしいです。
ゴリラは全員B型らしいです。
つまりゴリラはエンジニアってこと?
エンジニアがゴリラってこと?
ゴリラとエンジニアの間をとって
ゴジラにしましょう(謎提案)
**目次**
– [1. gorillaとは何か](#1-gorillaとは何か)
– [2. gorillaとginの違い](#2-gorillaとginの違い)
– [3. おわりに](#3-おわりに)## 1. gorillaとは何か
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493200/9b09366c-7472-7e6a-c0a3-94e747922be0.png)
[Gorilla, the golang web toolkit](https://gorilla.github.io/)
ゴリラは、霊長目ヒト科ゴリラ属
AWS+Lambda+API+GOでオウム返しLine Bot
# はじめに
– 「AWSとGoを勉強したい!」ということで、オウム返しをするLine Botを作成しようと思いました。
– AWSを使ったサーバーレスの基本の勉強にもなってよかったです!# 目標
– 以下の感じでオウム返ししてくれるbotを作成します。
![oumu_kansei.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525798/a1e1c91b-42f7-49c5-9445-6436b0eeb809.png)# 全体の構造
– Lineにメッセージを送ると、LINEプラットフォームは設定されたWebhook URLに対してPOSTリクエストを送信する。
– API Gatewayは、このリクエストをトリガーにLambda関数を実行する。
– Lambda関数はGo言語で書かれたコードを実行する。![line_bot_aws_oumu.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com
GoとReactでAPI通信
## 目的
前回、GoとReact環境をdockerで構築
https://qiita.com/zukka/items/5a6831bef702d8c910e0次は、フロント側のReact側からGoのAPIを呼び出して出力されたテキストをフロントに表示することを目標に。
## GoでAPIを構築
### webフレームワークGinを使う
GinはGo言語ベースのWebアプリケーションフレームワーク
軽量かつ実行速度が速いということが特徴https://gin-gonic.com/ja/
### インストール
go-sampleというモジュール名で初期する
go mod init は新しいGoモジュールを初期化するためのコマンド“`sh
docker-compose run –rm go sh -c ‘go mod init go-sample’
“`WEBフレームワークのginを取得する
“`sh
docker-compose run –rm go sh -c ‘go get -u github.com/gin-gonic/gin’
“`#
[翻訳転載] 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に必要なも