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

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

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 は見つけられなかった。もしご存じの方あればコメントいただけると嬉しいです。

| # | 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 main

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

import (
“net/http”
“tmp20240213/handler”
)

func main() {
http.HandleFunc(

元記事を表示

Goに入門

サーバー作りたいので`Go`で書いてみる:grinning:
まずは`Go`の基本的な書き方を確認:star:

## 実行
`.go`のあるフォルダでコマンド実行
“`
go run .
“`

## エントリーポイント
`main`関数が`Go`のエントリーポイントとなる
“`go
package main

import “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 := 1

n

元記事を表示

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 main

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

Welcome 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.md

Let’s get started!

? What application platform does your project use? [Use arrows to move, type to filter]
? What application