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

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

【Go言語】指定したパスがファイルなのかディレクトリなのかを判別する関数

### ファイルの存在確認

“`go
func IsFile(path string) bool {
info, err := os.Stat(path)
if err != nil {
return false
}
return !info.IsDir()
}
“`

1. `os.Stat(path)`を使って、指定したパスの情報を取得
2. エラーが発生した場合(`err != nil`)、指定したパスにファイルまたはディレクトリが存在しないため、`false`を返却
3. `!info.IsDir()`が`true`の場合、指定したパスはファイルであるため、`true`を返却

### ディレクトリの存在確認

“`go
func IsDir(path string) bool {
info, err := os.Stat(path)
if err != nil {
return false
}
return info.IsDir()
}
“`

1. `os.Stat(

元記事を表示

【Go, AWS】低予算APIサーバー構築を最初から最後まで【Golang, Lambda, DynamoDB, API Gateway, Cognito】

:::note
* `Go` -> `Python`差し替え編
* クライアント(`Vue.js`)編

執筆中です。
:::

:::note warn
価格・安全性など重要事項は随時ご自分で調べ、自己責任で作業をしてください。
筆者はいかなる損害について責任を負いかねます。
:::

## はじめに
低予算(規模が十分小さければ無料)で[REST APIサーバー](https://qiita.com/masato44gm/items/dffb8281536ad321fb08)を作りましょう。

DBあるよ!

## 概要
まず、低予算で推奨されるのが [**サーバーレス**](https://business.ntt-east.co.jp/content/cloudsolution/column-414.html) です。
厳密性を無視して簡単に言うと、 **常時待機するのではなく、必要な時だけ動作するサーバー** というイメージです。低予算でいける理由がこれでわかりますね。

思ったよりやること、というよりかは扱わないといけない機能が多いです。

![AWS_Rest.drawi

元記事を表示

ログファイルが邪魔でテストが実行できない

## 状況
– ファイルをログ出力に行う
– テストコードを書いている

## 問題
– VSCodeでユニットテストを行うとき、File Not Found エラーによりテストが実行できない

## 原因
– テスト時、作業ディレクトリがテストファイルの存在するディレクトリに移動してしまう
– このため、相対パスで記述したログファイルがNot Foundになってしまう

## 解決策
– テスト実行時はログファイルを使わないようにしよう

## 具体的に
– go runをする際、環境変数に起動モードのフラグを記述する
– さらに、本番モードで起動されたときはログファイルを起動しないようにする

## コード
– Bash
“`makefile
run:
MODE=”prod” go run $(CMD)

test:
MODE=”test” go run $(CMD)
“`

– ログファイルを扱うコード
“`go
if os.Getenv(“MODE”) == “prod”

元記事を表示

A Tour of GoでExercise: rot13Readerをやってみた

Goの学習でA Tour of Goをさらっています。
Methods and interfacesの章で[Exercise: rot13Reader](https://go-tour-jp.appspot.com/methods/23)をやったのでメモです。

# 解答
https://go.dev/play/p/-rVIDII1EaL

# やったこと
やったことは下記です

1. 状況把握
1. Readメソッドの返り値とReadメソッド中で変換するための文字列を取得する
1. Readメソッド内でROT13の処理をする

## 1. 状況把握
“Lbh penpxrq gur pbqr!”をROT13という変換方法を利用して文字列変換したものを出力する。
初期状態として下記が与えられている。このまま実行するとrot13Readerにio.Reader(Readメソッド)がないと言われます。

“`
package main

import (
“io”
“os”
“strings”
)

type rot13Reader struct {
r io.Reader
}

元記事を表示

dial error直った方法 – migrateできない

## 想定読者

– GO言語でMigrateしようとしたらdialエラーが出た人
– udemyでto do アプリ作ってる人

## 結論

dockerを起動するの忘れていた

![スクリーンショット 2024-03-12 175805.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551481/326245e2-f95e-a274-5d97-830447bacfbd.png)

## 試したこと
* ENVファイルの変数名チェック
* `db, err := gorm.Open(postgres.Open(url), &gorm.Config{})`を睨んだ

## 教訓
~~あるある言いたい~~
作業を中断して時間おくとdockerの存在忘れがち

元記事を表示

Go言語の圧縮ライブラリ比較

Go言語における圧縮ライブラリの性能を比較検討したので、その結果を共有します。

この評価は2024年2月頃に実施しています。

## 背景

Apache Cassandraのデータ圧縮アルゴリズムをGo言語で実装する際にのライブラリ選定のためのものです。
そのため、Apache Cassandraのサポートする圧縮アルゴリズムを中心に検証しています。

また、Apache Cassandraではスループットが最も高いLZ4がデフォルトの圧縮フォーマットとして採用されています。
Go言語でもLZ4はデフォルトで適用して問題ないような負荷なのかを評価するのが目的なので、主に圧縮率よりもスループットに注目しています。

また、データサイズもDBMSが取り扱うようなもの、具体的には数KiB〜100KiB程度を想定しています。

# 結論

## フォーマットが選べる場合のライブラリ選定

圧縮フォーマットを選べる場合、cgoを使ったライブラリが使えるかどうかによって2パターンに分けておすすめを紹介します。

### cgoを使っても問題ない

* バランス型
* github.co

元記事を表示

PulumiでAPI Gateway + Lambda(Go)をデプロイしてみた

# はじめに
以前から気になっていたIaCツールであるPulumiでAPI Gateway + Lambda(Go)のサーバレスなAPIを作成してみたので記事にしたいと思います。

### Pulumiとは
TerraformやCloudFormationなどと同じくIaCツールとなっていて、YAMLだけでなくGoやPython、TypeScriptなどで記述できることやAWS、Google Cloud、Azureなど様々なクラウドサービスに対応してることも特徴です。
さらにPulumiには**Pulumi AI**というChat GPTのように自然言語でチャットするだけでIaCのコードを生成してくれる機能があります。

### そもそもIaCとは
IaC(Infrastructure as Code)はインフラ(サーバー、ネットワーク、ストレージ)をコードで定義して管理する手法のことです。手動での管理と違ってコードで記述するので、手作業でのミスがなくなることやGitなどを用いることで管理の効率化が可能になっています。

# 開発環境
M1 MacBookで開発しています。

# 手順

元記事を表示

mockが期待した値を返さない

## 問題
– mockが期待した値を返してくれない

## 回答
– mockオブジェクトを使いまわしてないですか?
– mockに異なる振る舞いをさせたいときは、新たなmockオブジェクトを用意する必要があります
– 逆に、新たに用意しないと、前回の`on`メソッドの指示が更新されず、残ってしまいます

## 例
“`GO
// Test 1
uc := usecase.NewMockUseCase()
uc.On(“FetchData”, mock.Anything, 1).
Return(&model.Data{}, nil)
h = NewHandler(uc, nil)
uc.On(“FetchCollectionsList”, mock.Anything, 1).
Return(&model.Collections{}, nil)

_, err := h.HandleCollectionList()(writer, request)
assert.Equal(t, nil, err)

// Test 2
uc = useca

元記事を表示

Goでenumを使用する

Go で機能を作成しているときに、enum のような形で文字列を扱いたい場面がでてきました。
しかし、Go には厳密な意味での enum 型が存在しないため、その類似した機能を実現する方法を書き留めます。

# 方法 1: iota を用いた定数ブロックの作成をする

iota は定数宣言(const)で利用できる識別子で、型なしの整数の連番を生成します。
以下では、iota を用いて連番を生成し、それに対して String()メソッドを定義します。

“`
package main

import “fmt”

type YearNumberEnum int

// iotaを用いて連番を生成する
const (
Showa YearNumberEnum = iota
Heisei
Reiwa
)

// iotaを用いて生成した連番に対して、別名を与えて定義する
func (yn YearNumberEnum) String() string {
switch yn {
case Showa:
return “昭和”
case Heisei:
return “

元記事を表示

Go言語におけるAtoiとItoa

# AtoiやItoaに使われるAはASCIIのこと
AtoiとItoaは文字列と整数間の変換を行う際の関数です。
Atoiは「ASCII to Integer」の略になります。ASCII(アスキー)以外の文字列にも対応しています。
strconvのパッケージに属しています。

# Atoi (ASCII to Integer):文字列→整数

このコードでは、文字列 “123” を整数 123 に変換しています。変換に失敗した場合、エラーが返されます。

“`golang
package main

import (
“fmt”
“strconv”
)

func main() {
str := “123”
num, err := strconv.Atoi(str)
fmt.Println(“変換結果:”, num)
}
“`

# Itoa (Integer to ASCII):整数→文字列

“`golang
package main

import (
“fmt”
“strconv”
)

func main() {

元記事を表示

[go + htmx] 簡単なチャットWebアプリを作る

# はじめに
htmx や golang の websocket や html/template 周りの使ってみようということでWebサーバのみで完結する簡単なチャットアプリを作ってみました。
自分用にアウトプットしたというのが主な目的なので説明はかなり雑な感じになっています。

# フォルダ構成
以下作成したチャットアプリのフォルダ構成です。

“`bash
.
├── go.mod
├── go.sum
├── lib
│ └── generator.go
├── main.go
├── model
│ ├── message
│ │ └── message.go
│ └── room
│ └── room.go
└── views
├── index.html
└── parts
└── message.html
“`

## 実装
### ルーム
チャットルームは以下のような構造体で定義されていて、この構造体からルーム全体に broadcast したり、投稿されたメッセージを取得することができます。

webs

元記事を表示

GoLangとMailgunで実装する自動メール送信機能

# はじめに
この記事は自分がGolangとMailgunでメール送信サービスの実装をしたのでその流れを忘備録として残せたらと思って書いてます。加えて受託案件で自動メール送信機能を作ることはよくあると思うのですが、次のセクションで理由を記述しますが結構その時に自分と同じように困る人もいるかもと思ってこの記事を書いています。

# SendGrid使えなかった
自分もそうだったのですが、メール送信サービスと聞くとSendGridを思い浮かべる人が多いと思います。なので今回のタスクがアサインされた際はSendGridを使おうと思っていました。しかし結論から言うとSendGridが使えませんでした。
なんとSendGridの利用規約に

>システムの開発や運用を受託している企業が契約した場合、その使用権をクライアントに譲渡している、もしくは再販していることになります。
>そのため、メール送信者の立場にあたるクライアント企業に直接契約いただく必要があります。
>※開発から運用保守まですべてを請け負っている場合であってもクライアントにて契約いただく必要があります

とありました。つまりまとめると

元記事を表示

無を犠牲にするfloatパーサーを作る

## はじめに
お久しぶりです。Sugawara Yuutaです。前の記事を書いてからもう5、6ヶ月も経っているのですね。
大変なことばかりでしたが、僕は先日無事に高校を卒業することができました。これからどうするかはぼやっとしか決まっていませんが、今からも少しずつ技術を磨いていこうと思います。
さて、今回はすでに投稿した記事とは一風変わって、文字列を浮動小数点数(英: floating-point number)へ変換するアルゴリズムの高速化に取り組んできました。
高校時代全くと言ってよいほどできなかった数学の学び直しも兼ねて行ったので、最後まで読んでいただけると嬉しいです。
## なぜ重要なのか…
floatは世界中で使われています。ただこの仕組みの基本的なアイディアはシンプルだというのに、floatから文字列に変換したり、その逆は任意精度の演算が必要になり、どうしても複雑になってしまいます。なによりこの動作は時間のかかるものであり、この数十年の間で開発されたアルゴリズムも数個しかありません。
これを少しでも高速化し、シンプルにすることが今回の目標です。そんなことできるのでしょう

元記事を表示

【Go並行プログラミング】A Tour of Goの説明が頭に入らない人のためのゴルーチン&チャネル入門🌟

# はじめに

私はこれまでPython、JavaScript/TypeScript、PHPといった言語を中心にコーディングしてきました。しかし、仕事の都合上、Go言語の学習が必要になり、少しずつ学び始めてから3週間が経ちました。

2週目でポインタにつまづき、なんとか少し理解できるようになりました。そのときの学びログです。

https://qiita.com/s-kojima1227/items/cb8e0b99996fe71a237b

3週目に入り、今度は並行処理でこけました。なんとか少し理解できるようになったので、私と同じく並行処理が全然頭に入ってこない人に向けて、学びログを兼ねた記事を作成しました。

### 誰に向けた記事?

* 「A Tour of Go: Concurrency」に挑戦したが、説明が全く入ってこない人
* 一通りゴルーチンやチャネルについて学んだが、まだ学んだことを整理できていない人

![huh.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1166480/a0ec

元記事を表示

Go + Bun + Atlas でマイグレーション周りを自動化する

# はじめに
本記事は、以下二つの記事を大いに参考にさせて頂きました!🙏

https://zenn.dev/yulog/scraps/94958b03abeb96

その上で、自分なりにカスタマイズした内容や、構築途中に詰まったところを記載していきたいと思います。

# 環境
– Go v1.20.0
– PostgreSQL v15
– Bun v1.1.17
– Atlas v0.19.0
– golang-migrate
– Docker
– make

ディレクトリ構成はクリーンアーキテクチャ

# 最終的に実現したいこと
コマンド一発

元記事を表示

go.modが作成されない🔰

“`

go mod init

go mod tidy

“`

上記コマンド実行後の結果です

“`
MacBook-puro todo_app % go mod init

go: cannot determine module path for source directory /Users/氏名/Desktop/未定義/todo_app (outside GOPATH, module path must be specified)

Example usage:

‘go mod init example.com/m’ to initialize a v0 or v1 module

‘go mod init example.com/m/v2’ to initialize a v2 module

Run ‘go help mod init’ for more information.

MacBook-puro todo_app % go mod tidy

“`

・解決
“`
go mod init 任意のモジュール名(部品名)

go mod

元記事を表示

Golangの構造体の初期化方法~FunctionalOptionパターン編~

Golangで構造体の初期化をしようとすると、しばし**FunctionalOptionパターン**というデザインパターンの記事を見かけます。
Javaで開発してきた人にとって構造体の初期化は**Builderパターン**を用いることが多いためあまり馴染みのない言葉なのではないでしょうか?

今回はGolangの特性を活かした**FunctionalOptionパターン**が何なのか説明していきます。

# FunctionalOptionパターンとは
オブジェクトの構成や初期化時に柔軟性と読みやすさを提供するために使われるデザインパターンです。特にGo言語で広く利用されています。
**最大のメリットは、FunctionalOptionパターンを使用すると、クライアントコードは必要なオプションのみを指定して構造体の初期化をすることができる**ところにあります。
また**構成が非常にシンプルで、可読性が高い**といった特徴があります。

# 基本的なアプローチ

結論としては以下のようなコードです。ユーザー情報の構造体を初期化する処理を想定したコードです。
実装手順については後ほど説明

元記事を表示

Go言語の基礎 S2

# Go言語の文法

## 変数

### 型の種類
|型の名前|説明|サイズ|範囲|
|-|-|:-:|:-:|
|bool(boolen)|論理値型|1byte|“true“/“false“|
|string|文字列型|-|-|
|float32|単精度浮動小数点数|4byte|有効桁数6桁の実数|
|float64|倍精度浮動小数点数|8byte|有効桁数14桁の実数|
|int32|符号付き整数|4byte|-2147483648 ~ 2147483647|
|int64|符号付き整数|8byte|-9223372036854775808 ~ 9223372036854775807|
|int|符号付き整数|4byte / 8byte|“int32“または“int64“と同じ|
|rune|int32のエイリアス|4byte|Unicodeのコードポイント1文字分を格納|
|complex64|複素数|8byte|“float32“の実数部と虚数部を持つ複素数|
|complex128|複素数|16byte|“float64“の実数部と虚数部を持つ複素数

元記事を表示

Go言語の基礎 S1

# Go言語の導入
これらの記事を書くにあったって、Go言語の初心者向けのサイトを作成してもらったすべての人に感謝を表し、これを謝辞とさせていただく。

## Go言語の特徴
* コンパイル型言語
* 静的型付け言語
* 並行処理に強い
* C言語みたいに一文かいたらセミコロン(;)というのはない
* C言語などの言語と少し似ているため他の言語と少し似ている部分があり理解しやすい
* try-catchがない

## 学習サイト

### A Tour of Go

https://go-tour-jp.appspot.com/list

Goの公式が出しているもの。日本語訳されていてすでに他の言語を触ったことがある人ならこれをすべき!!

### Progate(プロゲート)

https://prog-8.com/courses/go

他の言語を触ったことがない、または初心者の方はこのサイトから始めるとよいだろう。一部**有料**という欠点はあるが、わかりやすいのでおすすめである。

## Go言語の環境構築

https://go.dev/dl/

上記のサイトから環境にあった

元記事を表示

はじめてのgRPC

業務で使う機会があり、ちゃんと理解したいなと思いやってみました。

## gRPCとは?
“`
Remote Procedure Call
“`
別の場所にある・別のサーバにあるProcedureを呼び出すものです。
それがRPCでそのRPCをGoogleが使えるようにしたものがgRPCです。

## gRPCのメリットとは?
gRPCを使うかというと以下のようなメリットがあります。

1\. 高性能と効率性
– Protocol Buffers(プロトコルバッファー)を使って通信をすることで高速に通信することができる
– JSONやXMLより軽量で速い
– HTTP/2を利用することでヘッダーの圧縮やストリームの多重化をすることができる

2\. 言語とプラットフォームの独立
– 多数のプログラミング言語で利用可能
– なので、システム間の連携とかもしやすい

3\. 強力な型付け
– プロトコルバッファーを使うことで型をちゃんとつけることができる

4\. ストリーミングサポート
– 以下のようなストリーミング機能をサポートしている
– クライアントストリーミング

元記事を表示

OTHERカテゴリの最新記事