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

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

【Go】Ginでhealth_checkのログを表示したくない

# はじめに
health_checkのログが多すぎて大事なログが見つけられない…みたいなことありますよね。
Ginの環境を作っている際にその問題にぶち当たったので、そんなお悩みを解決できる方法を備忘録としてまとめました。

# 結論
以下の2通りの方法で、特定のパス(ここでは/health)についてログ出力を抑制することができます。
“`go
router := gin.New()
router.Use(gin.LoggerWithWriter(gin.DefaultWriter, “/health”))
router.Use(gin.Recovery())
“`

“`go
router := gin.New()
router.Use(gin.LoggerWithConfig(gin.LoggerConfig{SkipPaths: []string{“/health”}}))
router.Use(gin.Recovery())
“`

通常、基本的なルーターの設定にはgin.Default()を使用することが多いと思います。
この関数はデフォルトで`Logger`と

元記事を表示

Go構造体のバリデーション: スペースの落とし穴

# はじめに
ウェブアプリケーションを開発する際、HTTPメッセージボディのデータの検証を行う場合があります。
例えば、ユーザーが入力した情報が必須項目を満たしているか、数値が適切な範囲に収まっているかなど。
Go言語でバックエンド開発を行うときには、構造体を使用したバリデーションが一般的です。

## Go言語でのバリデーション
Go言語では構造体を定義しそのフィールドに対してバリデーションルールを設定することができます。これにより、データの一貫性と正確性を確保し、エラーを未然に防ぐことができます。

“` struct.go
type Person struct {
Name string `json:”name” binding:”required,min=3″`
Age int `json:”age” binding:”required,min=0,max=100″`
}
// required: `Name`, `Age`共にフィールドは必須で、空の値は許可されない
// min=3: `Name`フィールドの値は最低でも3文字以上でなければならない

元記事を表示

GORM Updateについて表に整理してみた

gormのUpdateメソッドについてそれぞれ違いがあるので表にまとめてみた。

### GORMの更新メソッドの違い

| メソッド | 更新対象 | `UpdatedAt`の自動更新 | ゼロ値の扱い(数値型の0、空文字、boolのfalse など) | 主な用途 |
|——————|—————–|———————-|————————————————-|——————————-|
| `Save` | 全フィールド | する | 更新される | 全フィールドの更新、新規レコードの保存 |
| `Update` | 単一フィールド | する

元記事を表示

URLからQRコードを生成するアプリを作ろう

## はじめに

初めましての人もそうでない人もこんにちは!

最近就活を始めたという人はそこそこいるのではないでしょうか?
最近ではオンライン面接というものが増えてきていてZOOMやGoogleMeetを使って面接する企業も少なくありません!

おそらくこれを見ているあなたは面接の始めの方で「あなたの自己紹介(自己PR)をお願いします。」と聞かれた経験はあると思います!

自己紹介のやり方は様々ですが私は自己紹介スライドを用意してそのスライドを使って画面共有をしながら紹介をしています!

その中にこのQiita記事やGithubなどのQRコードを入れることでわざわざリンクをコピペせずともカメラ機能だけで見ていただくことができるようになるのでとても良いのではないでしょうか?

「書類選考の時にQiitaとかGithubのURLは出しているよー」という場合は書類選考の時に書くことができなかった他の自己PRできるものをQRコードにすれば良いのではないでしょうか?

しかしインターネット上に転がっているQRコード作成ツールを使って自分の情報が入ったサイトのURLを入れることに抵抗感があるひと

元記事を表示

サポーターズ(Docker)イベントに参加 2024.07.23

本日もサポーターズのイベントに参加した。

内容は、初心者向けのDockerについての解説とアウトプットの実施であった。

## Dockerとは
コンテナ型の仮想環境を気軽に構築、実行できるプラットフォーム。
Dockerはチーム開発にとても向いている。なぜなら、全く同じ環境で作ることができ、削除も簡単なためである。

ゲストOSは必要なく、ホストOS上で作成できる。ホストOSは仮想環境を動かす土台となっているOSである。
自分のPCのOSはWindowsなので、ホストOSはWindowsである。

イベントの中で注目していた3つのワードについての解説もあった。

## イメージ
イメージとは、コンテナを作るための設計図で、プロジェクトの名前、使用する技術のバージョンの指定などが記されている。

## コンテナ
コンテナとは、アプリケーションの実行環境のことで、プロジェクトのようなものである。
コンテナを作成、起動、削除が可能である。

## ボリューム
データの永続化を担う場所であり、外部HDDのようなもの。ボリュームを使わずにコンテナを削除するとデータが消えてしまうので、コン

元記事を表示

GORM UpdateColumnsはUpdatedAtを更新しない

## メモ
gormのUpdateColumnsはUpdatedAtを更新しない。
その仕組みを実際のコードとともに整理してみた。

その他のUpdateメソッドの挙動はついでに以下に整理した。
https://qiita.com/yukiyoshimura/items/a6fa5ac9ff1bd8d03be5

## 背景
gormの `UpdateColumns`を使っていたところUpdatedAtが更新されてないことに気づいた。
以下にHookメソッドをスキップするときに使ってねみたいなのが書いてある。
https://gorm.io/docs/update.html#Without-Hooks-x2F-Time-Tracking

### 実際にコードをみてみる
UpdateColumnsの処理をみる。
`tx.Statement.SkipHooks = true` でskipセットしている。
https://github.com/go-gorm/gorm/blob/master/finisher_api.go#L421
“`go:finisher_api.go
func

元記事を表示

【Paiza】山折り谷折り (paizaランク A 相当)をGo「Template」で解いた【text/template】

:::note warn
この記事は、「paiza×Qiita記事投稿キャンペーン」のキャンペーン対象問題の解説記事です。
**通常の「paizaスキルチェック問題」の解答公開は禁止されています** のでご注意ください。
:::

Go Templateだけでスキルチェックを突破しようとする ~~実用性0の~~ 記事2本目です。前回の記事はこちら。

https://qiita.com/Syuparn/items/de5f3a4b5bba41f4959c

# 解答

ソースコード(クリックで開く)

“`go
package main

import (
“bufio”
“os”
“text/template”
)

var tmplStr = `
{{- define “writeZero” -}}
{{- if ge (len $) 1 -}}
{{- $next := (slice $ 1) -}}
{{- template “writeZero” $next -}}
{{- print “0” –

元記事を表示

echoを使ったAPIキー認証のサンプル

# 概要
echoの使い方を勉強してみるがてら、APIキーによる認証を作ってみようと思い取り組んでみました。
APIキーによる認証の考え方がGCPのドキュメントにまとめられていたのでリンク置いときます。

https://cloud.google.com/endpoints/docs/openapi/when-why-api-key?hl=ja

# やってみた
リクエストヘッダに `X-API-KEY` としてAPIキーが付与されるものとして、curlで以下のようなリクエストを送る想定です。
“`bash:ターミナル
curl -H ‘X-API-KEY:testkey’ localhost:8080/hello
“`

## echoのミドルウェアを使ってみる
“`go:main.go
package main

import (
“net/http”

“github.com/labstack/echo”
“github.com/labstack/echo/middleware”
)

func main() {
e := echo.New()
// APIキーチ

元記事を表示

【Paiza】長テーブルのうなぎ屋 (paizaランク B 相当)をGo「Template」で解いた【text/template】

:::note warn
この記事は、「paiza×Qiita記事投稿キャンペーン」の **キャンペーン対象問題** の解説記事です。
**通常の「[paizaスキルチェック問題](https://paiza.jp/challenges)」の解答公開は禁止されています** のでご注意ください。
:::

# TL; DR

https://paiza.jp/works/mondai/b_rank_skillcheck_sample/long-table

“`
{{- /* 座席の初期化 */ -}}
{{- $seats := “” -}}
{{- /* nSeats <= 100 なので、100回のループをnSeats回で打ち切れば 長さ nSeats の文字列が得られる */ -}} {{- range $i, $_ := $.Looper -}} {{- if ge $i $.NSeats -}} {{- break -}} {{- end -}} {{- $seats = print $seats " " -}} {{- end -}} {{- /* グループを

元記事を表示

A Tour of Goの個人メモ

Goを触る機会が出てきそうなので、A Tour of Goを始めました。
学習した内容をメモしていきます。

# A Tour of Go

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

## パッケージ( package )

規約で、パッケージ名はインポートパスの最後の要素と同じ名前になります。 例えば、インポートパスが “math/rand” のパッケージは、 package rand ステートメントで始まるファイル群で構成します。

## factored import statement

factored の意味は、「要素化、グループ化、整理済み」

“`go:例
import (
“fmt”
“math”
)
“`

## Exported names

Goでは、最初の文字が大文字で始まる名前は、外部のパッケージから参照できるエクスポート(公開)された名前( exported name )です。

## Functions

関数名の後ろに型を書きます。

“`go:例
func add(x int, y int) int {
r

元記事を表示

【Golang 備忘録】VSCodeで”BrokenImport”が出たときに読んでほしい記事

導入

こんにちは。

Golangを学び始めて1ヶ月が経ち、ついにVSCodeでAPIサーバーを作ってみました。そこで、BrokenImportにとても苦しまされたのでその解決策を備忘録という形で残すことにしました。
初投稿であり、読みにくいと感じられる点もあるかと思いますが、参考になれば幸いです。

問題

私のAPIサーバーのディレクトリは下のようになっていました。(一部略)

api
├ cmd/
│ └ go.sum
│ └ go.mod
│ └ main.go
├ internal
│ ├ domain
│ │ └ user.go
│ │ └ works.go
│ ├ router
│ │ └ router.go
:
go.mod
└ go.su

元記事を表示

for文でcontinueの理解。使用例も合わせて

## 実装

“`go
for i := 1; i <= 100; i++ { if i%3 == 0 { fmt.Println(i, "3で割り切れる数") if i%5 == 0 { fmt.Println(i, "3でも5でも割り切れる数") } } else if i%5 == 0 { fmt.Println(i, "5で割り切れる数") } else { fmt.Println(i) } } ``` 上記のようにfor文の中身をif文で出し分けしてもいいのですが、可読性が悪くなるので下記のように書き換えることができます。 ```go for i := 1; i <= 100; i++ { if i%3 == 0 && i%5 == 0 { fmt.Println(i, "3でも5でも割り切れる数字") continue } if 1%3 == 0 { fmt.Println(i, "3で割り切れる数字") continue } if i%5 == 0 {

元記事を表示

Google Compute Engine(GCE)にGo(Echo)で作成したAPIをデプロイする

最近仕事でGCEにGoのEchoで作ったAPI資産をデプロイする必要がありました。

なんでわざわざVM?コンテナでよくない?というお話はあるのですが、色々な関係でテスト環境だけそうなってしまったので仕方がないです。

わざわざ記事に残す意味はあるかとも思いましたが、何となく今後も似たようなシチュエーションが出てきそうだったので、自分のために備忘録的な感じで残そうかと思います。

## インスタンスを立ち上げる

まずはデプロイするインスタンスを立ち上げるところです。

これは細かく書くほどでもないと思うので割愛します。

“`
# SSH
gcloud compute ssh –project [プロジェクト名] –zone [ゾーン名] [インスタンス名]

# 初期化
sudo apt-get update && sudo apt-get install

# 時刻の変更
sudo timedatectl set-timezone Asia/Tokyo
date

“`

## Goのインストール

まずはGoをサーバーにインストールします。

“`
sudo apt

元記事を表示

Go言語でREST API開発:CRUD操作を実装してみた

# はじめに
こんにちは、Webエンジニアの岩田史門([@SI_Monxy](https://x.com/SI_Monxy))です!
今回はずっと気になっていたGo言語に入門してみたのでREST APIの実装について記事を書いてみました!
改善点や修正点があれば、コメントにて優しくご指導いただけると嬉しいです!

# 概要
この記事では、Goを使って基本的なCRUD操作を行うREST APIを構築する方法を説明します。この記事を読み終えると、Go言語で簡単なREST APIを作成し、CRUD(Create、Read、Update、Delete)操作を実装する方法が理解できます。

# プロジェクトのセットアップ
まず、プロジェクトディレクトリを作成し、go modを初期化します。
“` bash
mkdir go-rest-api
cd go-rest-api
go mod init go-rest-api
“`

次に、必要なパッケージをインストールします。ここでは、HTTPルーティングにgorilla/muxを使用します。

“` bash
go get -u github.

元記事を表示

Go言語の構造体とインターフェースについてまとめてみた

# はじめに
こんにちは、Webエンジニアの岩田史門([@SI_Monxy](https://x.com/SI_Monxy))です!
今回はずっと気になっていたGo言語に入門してみたので、構造体とインターフェースについて記事を書いてみました!
改善点や修正点があれば、コメントにて優しくご指導いただけると嬉しいです!

# 概要
Go言語は、オブジェクト指向プログラミング(OOP)の概念をサポートしており、構造体とインターフェースを使用することで実現できます。この記事では、Goにおける構造体とインターフェースの基本を理解し、オブジェクト指向のプログラミング方法について学びます。

# 構造体とは
構造体(struct)は、フィールドの集まりを定義するための型です。構造体は、データをカプセル化し、関連するデータを一つの単位として扱うことができます。

# 構造体の定義と使用
以下の例では、Person構造体を定義し、そのインスタンスを作成します。

“` go
package main

import “fmt”

// Person構造体の定義
type Person struct {

元記事を表示

Go言語に入門してみたので基本文法をまとめてみた

# はじめに
こんにちは、Webエンジニアの岩田史門([@SI_Monxy](https://x.com/SI_Monxy))です!
今回はずっと気になっていたGo言語に入門してみたので基礎文法について記事を書いてみました!
改善点や修正点があれば、コメントにて優しくご指導いただけると嬉しいです!

# 概要
Go言語(Golang)は、シンプルで効率的なプログラミング言語です。この言語は、Googleによって開発され、高いパフォーマンスと並列処理のサポートを特徴としています。本記事では、Go言語の基本的な文法と最初のプログラムの書き方について解説します。

# Go言語の特徴
Go言語は以下のような特徴を持っています

– シンプルな文法:コードが読みやすく、保守しやすい。
– 高いパフォーマンス:コンパイルされたバイナリは高速に動作する。
– 並列処理のサポート:goroutineを使用して並列処理を簡単に実装できる。
– 標準ライブラリが豊富:多数の標準ライブラリが用意されており、追加の依存を最小限に抑えられる。

# Go言語の環境設定
Go言語を始めるためには、まず環境を設定

元記事を表示

【ハンズオン】LangChain + Goを使用した生成AIアプリケーションをつくってみよう!【LangChain/Go/RAG/Gemini】

## はじめに

どうも、こんにちは!LLMについては特段詳しくないフツーのバックエンドエンジニアの[@オーガ](https://twitter.com/o_ga09)といいます。

今回はそんな僕が、LLMを使用した生成AIアプリケーションをつくるというハンズオン的な感じの記事にしておこうと思っています。よろしければ、最後までお付き合いください!

## 対象読者

– Geminiさわってみたい方
– Goさわってみたい方
– Gopherくんが好きな方

## 目次

– [なぜ、Go + Geminiなのか?](#なぜgo–geminiなのか)
– [GoでLLMってプロダクトレベルで使われているの?Pythonじゃないの?](#goでllmってプロダクトレベルで使われているのpythonじゃないの)
– [つくるもの](#つくるもの)
– [技術構成](#技術構成)
– [LangChainでなにができる?](#langchainでなにができる)
– [ベクトル検索とは?](#ベクトル検索とは)
– [【ハンズオン】LangChainで生成AIアプリを作成する](#ハンズオ

元記事を表示

【Go】json.Decoderとjson.Encoder

# はじめに
GoでJSONを扱う場合、最初に出会うのが`json.Marshal`と`json.Unmarshal`だと思います。

しかし、これらはバッファにデータを格納したり、読み取ったりすることで実現されるのですが、`Decoder`と`Encoder`を使えば、リクエストボディのストリームから直接デコードしたり、エンコードしたりするため、一時的なバッファを作成する必要がなく、メモリ使用量を抑えることができます。

またコードも簡潔に書くことができるため可読性も上がります。

今回は、そんな`Decoder`と`Encoder`を使い方を確認します。

# MarshalとUnmarshalを使用する場合
“`go
// POST /article
func PostArticleHandler(w http.ResponseWriter, req *http.Request){

// Header.GETの返り値はstringなのでAtoiで整数に変換
length, err := strconv.Atoi(req.Header.Get(“Content-Length

元記事を表示

クリーンアーキテクチャに入門してみた 後編

# はじめに

– 前回クリーンアーキテクチャの理論的な部分を学んだので今回は実際にクリーンアーキテクチャで簡単なサンプルアプリの実装をしてみたのでその解説です
– [前回の記事](https://qiita.com/aaaasahi_17/items/b4b4d08dbad45a270bd8)
– 実装にはGo言語を使用しています

# 実装

## 構成など

### 実装したサンプルアプリのリポジトリ

https://github.com/aaaasahi/go-clean-app

### 使用技術

– Go 1.21.0
– echo (https://github.com/labstack/echo)
– MySQL 8.0

### ディレクトリ構成

“`
├── application # ユースケース
├── config # 各種設定値
├── domain   # ビジネスロジックのコア部分(エンティティ、リポジトリインターフェース)
├── infra   # データベースなど外部サービスとの通信
├──

元記事を表示

gRPCのバリデーションツール「protovalidate」を使ってみよう

# はじめに

弊社では、Next.jsとGoを使ったWebアプリケーション開発を行っています。Go側では、Protocol Buffersのメッセージにバリデーションルールを定義するためのライブラリ「protovalidate」を利用しています。

protovalidateは、BufによるgRPCのバリデーションツールで、Protobuf Validationの後継にあたります。このツールを使うことで、protoファイル内にバリデーションルールを直接記述できます。そして、そこから自動生成されるコードを利用することで、Next.jsとGoの両方で共通のバリデーションルールを適用することができるのです。

# protovalidate とは?

protovalidate は、Buf が提供する gRPC のバリデーションツールです。Protobuf Validation の後継にあたり、proto ファイル内でバリデーションルールを定義することができます。

# protovalidate の主な特徴

– protoファイル内でデータのルールを直接定義できる
– 文字列の長さ

元記事を表示

OTHERカテゴリの最新記事