Go関連のことを調べてみた

Go関連のことを調べてみた

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に必要なも

元記事を表示

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-cli

scoop bucket add java
scoop install openjdk
“`

### テスト用OpenAPI yaml(petstore.yaml)の取得

* PetstoreのOpenAPI仕様ファイル(`petstore.yaml`

元記事を表示

[翻訳転載] Golang Tip #22: 構造体やオプションパターンを使って関数のシグネチャをシンプルにする

https://qiita.com/a10a/items/5063899c9f4a3bf4a2f2

本記事は以下のツイートの翻訳転載です。

関数に多くの引数を渡したい場合どうするか、という内容になります。

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 main

import (
“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

元記事を表示

OTHERカテゴリの最新記事