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

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

Go言語でテストごとにデータベースを空にする方法

## はじめに

今回は、ポートフォリオ開発で作成したテストの中で、DBを用いたテストでした工夫を紹介します。

今回作成したコードはGithubにpushしてあるので参考程度にどうぞ

https://github.com/piny940/portfolio

ポートフォリオはこちらから確認できます。

https://www.piny940.com

## 解決策
各テストごとにトランザクションを張り、テストが終わったらロールバックすることで、データベースのデータを空にすることができます。

まず、テスト開始時にテスト用のデータベースに接続をします。

“`go
func TestMain(m *testing.M) {
dsn := fmt.Sprintf(“user=%s password=%s host=%s dbname=%s sslmode=%s”,
os.Getenv(“DB_USER”), os.Getenv(“DB_PASSWORD”), os.Getenv(“DB_HOST”),
os.Getenv(“DB_NAME”), os.Getenv(“DB

元記事を表示

初めてのオニオンアーキテクチャ実装チャレンジ

# はじめに
はじめまして、この間、路頭に迷っていた子猫を保護して人生で初めて猫と生活を始めた、初級者エンジニアです。
依存関係の逆転?アーキテクチャパターン?って何・・・?みたいなところからスタートし、勉強のためにオニオンアーキテクチャ(的な)実装チャレンジをGo(echoフレームワーク)でしてみたので、備忘録です。

# オニオンアーキテクチャについて
オニオンアーキテクチャは、ソフトウェア開発において柔軟で維持しやすいアプリケーションを構築するための設計パターン。
このアーキテクチャの目的は、アプリケーションのコアを保護し、各層が次の層にのみ依存するようにすることで、結合を制御し、より保守性の高いアプリケーションを作ること。

※オニオンアーキテクチャを表す玉ねぎの画像([Jeffrey Palermoさんのサイトから拝借](https://jeffreypalermo.com/2008/07/the-onion-architecture-part-1/))
![image.png](https://qiita-image-store.s3.ap-northeast-1.amaz

元記事を表示

[Go言語] Echo でルーティング

# はじめに

Go 言語のフレームワークである [Echo](https://echo.labstack.com/) を使ってバックエンドを実装する際の、ルーティング に関する備忘録です。
私はこうやったということを残すものであり、ベストプラクティスではありませんが、みなさまの参考情報となれば幸いです。

# 環境と各ツール

| | バージョン | 備考 |
| ————————————————————– | ——— | —————————————————- |
| [Go](https://go.dev/) | v1.2

元記事を表示

【Go言語学習】ポインタのレシーバの実験

レシーバがポインタとそうでないと何が違うのだろうと思ったので、
基本的には大きいデータの構造体はポインタで扱うのが良いというのと、ポインタで扱う場合は、副作用に注意する必要があるということ。
副作用は、現状アイディアが無いので、とりあえず処理時間とメモリの使用量を比べてみることに…
この実験は結論から言うと、面白くない結果です…アイディアが乏しいのが原因かな…悔しい

## ポインタの時
func (g *Group) Go(f func() error)の場合、gはポインタなので、同じオブジェクトを複数のゴルーチンで使用すると、それらのゴルーチンがオブジェクトの状態を同時に変更しようとすると競合状態が発生する可能性ある。
同じオブジェクトを複数のゴルーチンで使用する場合は、適切な同期メカニズム(例えば、ミューテックス)を使用して、同時アクセスを制御することが重要。(今回何もしていなので、何かすれば間違いなく結果は変わるでしょう)
“`Go
package main

import (
“fmt”
“runtime”
“sync”
“time”
)

type

元記事を表示

【個人開発】AIがおすすめの飲食店を教えてくれるLINEチャットボットを作りました

# AI美食探訪というアプリを開発しました

Line上でやりとりできるAIチャットアプリです。
メッセージを送信すると、条件にあったお店を紹介してくれます。
(一応テスト版という状態です。実運用での入力データを集めること、それを精度向上に役立てることを目的としています)

ここからLineの友達追加ができます。
スマホの通常のカメラで読み取れます。
![qr20240512113623589.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473706/08192e49-ec0b-a136-9290-e4ef463bb7a0.png)

こちらからでも🙆‍♂

https://liff.line.me/1645278921-kWRPP32q/?accountId=234luzuw

ぜひ試してみて、フィードバックをいただけると大変嬉しいです。

お問い合わせ用

https://docs.google.com/forms/d/e/1FAIpQLSdLV7zaDC9U8YoiVPXwg3mpx_7pRw

元記事を表示

Goでwebアプリケーションを作成してみよう!~webアプリケーションとは~

この記事では4回に分けてwebアプリケーションの作り方を説明していく
第1回
 webアプリケーションの構成、仕組み(この記事)
第2回
 [サーバーの立ち上げ](https://qiita.com/Yutosaki/items/fcd773a278e9b8663f36 “第2回”)
第3回
 フロントエンドの実装(URL)
第4回
  バックエンドの実装(URL)

実際に作ったアプリケーション

https://github.com/Yutosaki/WiFiRader

# そもそもwebアプリケーションとは
webアプリケーションとは、高度な性能のwebサイトのような認識で大丈夫。

・webサイト
webサイトは静的なコンテンツが提供され、何かを読んだり、動画を視聴できたりなどの比較的単純なインタラクションが行われる。頻繁に更新はされない。

・webアプリ
webアプリは動的なコンテンツを提供し、ユーザーの情報に応じて、データベースやサーバーなどと連携し、リアルタイムで情報を更新、管理する。

・モバイルアプリケーションとの違い
webアプリと違い、インストー

元記事を表示

blastengineを使ってGo言語でメールを送信する

[blastengine](https://blastengine.jp/)はシンプルに使える開発者向けメールサービスを提供しています。何かと面倒なメール配信をシンプルに、かつ確実に送信先に届くようになります。

今回はblastengineを使って、Go言語でメール送信を行うまでの流れを解説します。

## ユーザ登録する

blastengineにユーザ登録します。管理画面に入るためのユーザID、パスワードが手に入るので、ログインします(ユーザIDは後で使います)。

![getting-started-4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/5c6c8cb0-9ad1-0a6d-88fe-e24bc3ee7b17.jpeg)

## 送信元ドメインのSPFを設定する

送信元として利用するドメイン(自分で持っているもの)の設定をします。これは任意のドメイン管理サービスで設定できますが、TXTレコードに以下のSPFを追加します。

“`
txt @ v=spf1 incl

元記事を表示

今回のプロジェクトを終えて #02

## プロジェクトの概要

私は所属するLTサークルで使用されるスライドを公開するウェブサイトを開発しました。このサイトは、サークルメンバーが作成したプレゼンテーションを広く共有し、アーカイブすることを目的としています。

## 動機

私たちのサークルでは毎週LTが開催されますが、これらの貴重なコンテンツが内部に留まり、外部の人々と共有する手段がありませんでした。このプロジェクトの主な目標は、知識の共有を促進し、学びをサークルの外に広げるためのプラットフォームを提供することです。

## 制作期間
このプロジェクトは初期バージョンを2週間で開発しましたが、ユーザーからのフィードバックを受けて現在も定期的にアップデートを行っています。

## 使用技術とツール
### フロントエンド
・Next.js
・TypeScript
### バックエンド
・Echo
・Go
### その他
・GCP
・Vercel

詳しくはGitHubのリポジトリをご覧ください
https://github.com/R1013-T/slide-share

## 振り返り

### 成果
実際に機能するウ

元記事を表示

【Go言語学習】引数の参照渡しについて

以下のコードは、セマフォを使って(あんま意味ないけど)、同時実行数を制限しているコードで遊んでいたのですが、do関数の引数について疑問が発生したのでメモ。

“`Go
package main

import (
“context”
“fmt”
“log”
“time”

“golang.org/x/sync/semaphore”
)

func main() {
sem := semaphore.NewWeighted(5)

go do(sem, func() { time.Sleep(1 * time.Second) }, 1)
go do(sem, func() { time.Sleep(1 * time.Second) }, 2)
go do(sem, func() { time.Sleep(1 * time.Second) }, 3)
go do(sem, func() { time.Sleep(1 * time.Second) }, 4)
go do(sem, func() { time.Sleep(1 * time.Second) }, 5)

元記事を表示

Go gosimple S1016 警告について

go-golangci-lint(gosimple)で、以下のような警告が表示されました。

“`
S1016: should convert v
(type github.com/nanato-okajima/repository/internal/model.User)
to github.com/nanato-okajima/repository/internal/model.UserResponse
instead of using struct literal (gosimple)go-golangci-lint
“`

## 構成

以下のような実装をしています。
DBから取得したデータをクライアントへ返却する際に
構造体同士の移し替えを行っています。
この際にgo(gosimple)で警告が表示されていました。

“`go
// データベースから取得したデータを入れるDTO
type User struct {
ID uint64
Name string
Age uint64
}

// クライアントへ返却するデ

元記事を表示

【Go言語】テンプレートエンジンでtableをレンダリングしてechoで表示してみた

## はじめに
Goの標準で用意されているテンプレートエンジン(html/template)を使って、htmlのtableをレンダリングし、echoでwebサーバーを建てて表示してみました。

## 環境
* macOS Sonoma 14.4.1
* Go 1.22.3 darwin-arm64

## 表示したいもの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787613/f942a972-c091-357e-590b-203da0c575aa.png)

このようなテーブルを表示するhtmlを出力することがゴールとなります。
“`html:html



Table Rendering

元記事を表示

【Cloud Spanner】yoを使ってスキーマからGoの構造体を生成する

# はじめに

本記事では、Cloud Spanner用のコード生成ツールである yo について説明します。

# Spannerについて

Cloud Spannerは、Google が提供するフルマネージド型の分散データベースです。従来のリレーショナルデータベース(SQL)のトランザクション正確性と整合性を維持しつつ、NoSQL データベースのように水平方向へのスケーラビリティを持つ NewSQL に該当します。

https://cloud.google.com/spanner?hl=ja

# **yoについて**

yoは[Cloud Spanner](https://github.com/xo/xo)のスキーマ定義から Go のコードを自動生成するツールで、次の特徴があります。

– Go の構造体をスキーマから生成
– CRUD 操作のための関数を生成
– CUD については、Mutation を返します
– セカンダリーインデックスに対応した取得関数を生成
– FindTableNameByIndexName みたいなメソッドが生成されます

ただし、J

元記事を表示

【Go言語学習】chan struct{}

この意味不明なコードは何なんだ?
と思ったら、Go言語の仕様上、struct{}はゼロサイズのデータを表すものとのこと。
つまりメモリを消費しないものを表している。
ただし、変数やチャネルで使用した場合、これらを管理するためのメモリは当然消費される。
チャネルで使用する場合、目的はデータのやり取りで無く、ゴルーチンの同期が目的になる。

“`Go
package main

import (
“fmt”
“time”
)

func main() {
doneCh := make(chan struct{})

go func() {
time.Sleep(2 * time.Second) // 何かの処理を模擬
close(doneCh) // 処理が終了したらチャネルを閉じる
}()

fmt.Println(“Waiting for the goroutine to finish…”)

<-doneCh // チャネルが閉じられるまで待つ fmt.Println("The goroutine has finished!") } ```

元記事を表示

Goを基本からまとめてみた【基礎】

## go mod init

– go mod init は、新しいGoモジュールを初期化するためのコマンドで、このコマンドを実行すると、モジュール名をパラメータとして受け取り、その名前で新しいモジュールを作成する。

“`
go mod init booking-app
“`
– Goプログラミング言語のコマンドの一部で、これを使用すると、Goプログラムをビルドして実行できる。
“`
go run
“`

“`
vim .zshenv

※Press i to enter insert mode.
※Press Enter to add a new blank line.
※Press Esc to return to normal mode.
※Type :wq to save and exit.
“`

## 参考サイト
[【Go言語マスター#2】現役エンジニアがGo言語を解説! 〜Goのプログラムを実行〜](https://www.youtube.com/watch?v=ZZf6Ogv4ONI&list=PLGqNraLKYNV

元記事を表示

Go-for文で繰り返し処理

# Go言語のFor文の基本構文、実例を紹介します!

### for文の基本構文
以下がfor文の基本構文となります
“`go:sample.go
for 初期値 ; 条件 ; 後処理 {
}
“`
補足
:point_up:初期値はforループのスコープ内でのみ有効
:point_up:条件がtrueの間にforループが行われる
:point_up:後処理はイテレーション毎の最後に実行されます

以下にコード例を示します
“`go:sample.go
package main

import “fmt”

func main(){
for i := 0 ; i <= 5 ; i++ { fmt.Println(i) } } /* 出力 0 1 2 3 4 5 */ ``` ちなみに、初期値と後処理は任意となっています。 ```go:sample.go package main import "fmt" func main(){ i := 0 for i <= 5 { fmt.Print(i)

元記事を表示

dockerでGoファイルを実行する方法

### コンテナ内に入る
“`bash
docker exec -it hogehoge /bin/bash
“`
※`hogehoge`はコンテナ名

#### 結果
“`bash
root@123456789:/app#
“`
※`123456789`はコンテナID

### Goファイルを実行
実行したいファイルが格納されているディレクトリに移動し、以下を実行
“`bash
go run hogehoge.go
“`

元記事を表示

Go入門 : Go(Gin)で簡単にWebサーバーを作ってみる

# はじめに

Go言語でWebサーバーを立てる方法について、学習のメモとしてまとめていきます。

・version : go 1.22.2

# Webサーバーを実装

まず初めに、下記のコマンドでmoduleの初期化を行います。

“`
go mod init モジュール名
“`

go.modファイルが作成されます。

次に、下記のコマンドで`main.go`のファイルを作成します。

“`
touch main.go
“`

最初に、`Hello Golang!!` を出力するcodeを`main.go`に記述してみましょう。

“`main.go
package main

import “fmt”

func main() {
fmt.Println(“Hello Golang!!”)
}
“`

記述後、下記のコマンドで `Hello Golang!!` が出力されるか確認しましょう。

“`
go run main.go
“`
`Hello Golang!!` が出力されればOKです。

# Ginを導入する

下記の公式Docsを参考に、G

元記事を表示

【Go言語学習】チャネルとミューテックス

# チャネル
ゴルーチン間でデータを安全にやり取りするための手段。
データの送受信が同期的に行われるため、データ競合を防ぐことができる。
チャネルはゴルーチンの同期にも使用でき、一つのゴルーチンが結果を計算し、その結果を別のゴルーチンに送信するといった場合に便利である。
→同期処理

# ミューテックス
一つのゴルーチンだけが特定のリソース(例えば、共有データ構造)にアクセスできるようにするための手段。
複数のゴルーチンが同時に同じリソースにアクセスしようとしたときのデータ競合を防ぐために使用される。
→排他制御

https://github.com/kabasunny/GoPractice/tree/main/channels

“`Go
package main

import (
“fmt”
“sync”
“time”
)

type SafeCounter struct {
v map[string]int
mux sync.Mutex
}

func (c *SafeCounter) Inc(key string, ch chan int) {
c.mux

元記事を表示

Goで2進数の0,1の数を数えたい

## 結論
`math/bits`パッケージの
– TrailingZeros()
– LeadingZeros()
– OnesCount()

を使うと簡単に分かります。

https://pkg.go.dev/math/bits#LeadingZeros

## 背景
競技プログラミングで、2進数の末尾の0の数を求める問題を解いた際に
便利な公式パッケージがありましたので紹介します。

## どう使うの?
“`go
var n uint16 = 16 // 10000(2進数)

// お尻から0がいくつ続くか
fmt.Println(bits.TrailingZeros16(n))
// 頭から0がいくつ続くか
fmt.Println(bits.LeadingZeros16(n)) // 0000 0000 0001 0000(2進数)
// ビットが1の数を求めたい場合
fmt.Println(bits.OnesCount16(n))
“`
uint型のbit数に応じて関数名が変わります。
(uint型の場合、bits.Tr

元記事を表示

【Go言語学習】チャネル( Channel )

# A Tour of Goでの説明

Channels
チャネル( Channel )型は、チャネルオペレータの <- を用いて値の送受信ができる通り道です。 https://go-tour-jp.appspot.com/concurrency/2 # ゴルーチン間で値のやり取り ゴルーチンは非同期だけど、チャネルを使って同期させる。 情報処理検定で出てくる、キュー(先入れ先出し、FIFO)の動作。最初にチャネルに送信したデータが最初に受信される。スタック(後入れ先出し、LIFO)ではないイメージ。 mainゴルーチンの最後にチャネル受信を用意しておくと、全終了を待たせることができる。 # デットロック チャネルへの送信操作は、そのデータが受信されるまでゴルーチンをブロックするため、同じゴルーチン内でチャネルの送受信を行うとデッドロックが発生する。→バッファ付きチャネルを使用すれば解消する。 # 試してみた ```go package main import ( "fmt" "time" ) func main() { ch1 := make(chan int)

元記事を表示

OTHERカテゴリの最新記事