- 0.1. Google Compute Engine(GCE)にGo(Echo)で作成したAPIをデプロイする
- 0.2. Go言語でREST API開発:CRUD操作を実装してみた
- 0.3. Go言語の構造体とインターフェースについてまとめてみた
- 0.4. Go言語に入門してみたので基本文法をまとめてみた
- 0.5. 【ハンズオン】LangChain + Goを使用した生成AIアプリケーションをつくってみよう!【LangChain/Go/RAG/Gemini】
- 0.6. 【Go】json.Decoderとjson.Encoder
- 0.7. クリーンアーキテクチャに入門してみた 後編
- 0.8. gRPCのバリデーションツール「protovalidate」を使ってみよう
- 0.9. GitHub ActionsでGolangとProtocol Buffersのコード品質を維持しよう!
- 0.10. Go言語の特徴
- 0.11. 【Go言語】パニック
- 0.12. AWS Lambdaを定期的に実行するためにEventBridgeを設定する [Terraformを使用]
- 0.13. AWS LambdaにGo言語のスクリプトをDockerイメージでデプロイする [Terraformを使用]
- 0.14. AWS LambdaにGo言語のスクリプトをzipファイル形式でデプロイする [Terraformを使用]
- 0.15. 【Go言語】名前付き戻り値
- 0.16. Go言語のContextについて
- 1. contextとは?
- 2. WithTimeout
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 mainimport “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ファイル内でデータのルールを直接定義できる
– 文字列の長さ
GitHub ActionsでGolangとProtocol Buffersのコード品質を維持しよう!
# はじめに
ソフトウェア開発においてコード品質を維持することは非常に重要です。コードの品質が低下すると、バグの発生リスクが高まり、保守性や拡張性が損なわれてしまいます。そこで、コードの品質を自動的にチェックするためのツールを導入し、CI/CD パイプラインに組み込むことが有効な対策となります。
この記事では、GitHub Actions のワークフローファイルを使って、Golang のコードとスキーマファイル(Protocol Buffers)の品質をチェックする方法を紹介します。
# ワークフローファイルの概要
以下のワークフローファイルは、2 つのジョブから構成されています。
“`yml
name: Lint for Golangon:
push:
pull_request:jobs:
golangci-lint:
runs-on: ubuntu-latest
steps:
– uses: actions/checkout@v4
– uses: golangci/golangci-lint-action@v6
Go言語の特徴
# はじめに
ソフトウェア開発の世界には、多くのプログラミング言語があります。
Python、JavaScript、C、Ruby、最近ではRustやKotlinなど、それぞれ特徴があります。
様々なプログラミング言語に触れてきました。その中でも私が特に印象に残っているGo言語について解説したいと思います。
# Go言語とは
“**Go**”という名前にもあるようにGoogleが開発した言語です。
2009年に発表され、現在では様々なサービスに利用されています。
日本のサービスだと、メルカリやクックパッドなどがあります。[^1]
![スクリーンショット 2024-06-06 160725.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809382/2075dcef-9ad5-e3ed-9f04-dfe5fde9b159.png)
# 特徴
特徴は大きく分けて3つほどあります。後ほど順に解説します。
* コンパイラ型
* 記述がシンプル
* 未使用の変数、モジュールはエラーになる## コンパイラ型
ま
【Go言語】パニック
# はじめに
Goにはtry/catchがないが、panicやrecoverをむやみにつかってはいけない。一般的には、error型で返すのが好ましい。
# panicとは
[Go Playground](https://go.dev/play/p/AQKptHYU6SO)
“`go
func main() {
fmt.Println(“a”)
panic(“foo”)
fmt.Println(“b”)
}
“`パニックが発生すると、現在の goroutine がリターンするか、recover でパニックが捕捉されるまで、パニックはコールスタックをさかのぼる。
以下はrecoverで捕捉する例である。
“`go
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println(“recover”, r)
}
}()f() // パニックが発生するfをコールする
}func f() {
fmt.Println(“a”)
panic(“foo”)
fmt.
AWS Lambdaを定期的に実行するためにEventBridgeを設定する [Terraformを使用]
## 要約
最終的なソースコード全体は以下のリンクからご確認いただけます。https://github.com/mochi-yu/qiita-material/tree/main/lambda-with-event-bridge-by-terraform
## 関連記事
Go言語で記述したスクリプトを、**AWSのLambdaにTerraformを用いてデプロイする**機会があり、その過程の試行錯誤を整理して一連の記事にまとめました。この記事はそのうちの3本目として、GoのスクリプトをAWS EventBridgeから定期実行する構成をデプロイしてみたいと思います。
– [zipファイルを用いてGo言語の処理をAWS Lambdaにデプロイする](https://qiita.com/mochi_2225/items/1b645f87148899f1bc09)
– [Dockerイメージを用いてGo言語の処理をAWS Lambdaにデプロイする](https://qiita.com/mochi_2225/items/000ee604b3a274b6b62d)
– **Even
AWS LambdaにGo言語のスクリプトをDockerイメージでデプロイする [Terraformを使用]
## 要約
最終的なソースコード全体は以下のリンクからご確認いただけます。https://github.com/mochi-yu/qiita-material/tree/main/golang-lambda-by-docker-with-terraform
## 関連記事
Go言語で記述したスクリプトを、**AWSのLambdaにTerraformを用いてデプロイする**機会があり、その過程の試行錯誤を整理して一連の記事にまとめました。この記事はそのうちの2本目として、Dockerイメージを用いてLambdaにスクリプトをデプロイしてみたいと思います。
– [zipファイルを用いてGo言語の処理をAWS Lambdaにデプロイする](https://qiita.com/mochi_2225/items/1b645f87148899f1bc09)
– **Dockerイメージを用いてGo言語の処理をAWS Lambdaにデプロイする**(この記事)
– [EventBridgeからAWS Lambdaを定期実行する処理をデプロイする](https://qiita.com/mo
AWS LambdaにGo言語のスクリプトをzipファイル形式でデプロイする [Terraformを使用]
## 要約
最終的なソースコード全体は以下のリンクからご確認いただけます。https://github.com/mochi-yu/qiita-material/tree/main/golang-lambda-by-zip-with-terraform
## 関連記事
Go言語で記述したスクリプトを、**AWSのLambdaにTerraformを用いてデプロイする**機会があり、その過程の試行錯誤を整理して一連の記事にまとめました。この記事はそのうちの1本目として、zipファイルを用いてLambdaにスクリプトをデプロイしてみたいと思います。
– **zipファイルを用いてGo言語の処理をAWS Lambdaにデプロイする**(この記事)
– [Dockerイメージを用いてGo言語の処理をAWS Lambdaにデプロイする](https://qiita.com/mochi_2225/items/000ee604b3a274b6b62d)
– [EventBridgeからAWS Lambdaを定期実行する処理をデプロイする](https://qiita.com/mochi_22
【Go言語】名前付き戻り値
# はじめに
Goでは名前付き戻り値(Named Return Value)はあまり使われない。
この記事では、名前付き戻り値の使い方を解説します。# 名前付き戻り値とは?
名前付き戻り値を使うと、引数なしの空return文を呼び出せる。
“`go
func f(a int) (b int) {
b = a
return
}
“`上記の場合だと、戻り値はbの値となる。
# 名前付き戻り値の使用例
非公開のインターフェイスの場合ドキュメントは必須ではない。以下の例は、住所から座標を取得するメソッドを持つインターフェイスである。
“`go
type locator interface {
getCoordinates(address string) (float32, float32, error)
}
“`ドキュメントがないと、`float32`の情報だけでは、緯度か経度かが不明瞭である。
そこで以下のように、名前付き戻り値を使用することで、シグニチャを明示する。“`go
type locator interface {
getC
Go言語のContextについて
contextとは?
Go言語ではcontextパッケージを利用して、WithTimeout、WithCancel、WithDeadlineを使い、main側に通知しsub goroutineを一斉キャンセルすることができます。
下記でcontextを活用する3つのパターンを紹介します。WithTimeout
タイムアウトを経過したときに一斉にsub goroutineをキャンセルする処理を書いていきます。
contextのDoneチャネルを使う事によってsub goroutinesの処理を一斉にキャンセルすることができます。“`Go
package mainimport (
“context”
“fmt”
“sync”
“time”
)func main() {
var wg sync.WaitGroup
// 400ミリ秒後にタイムアウトを設定
ctx, cancel := context.WithTimeout(context.Background(), 400*time.Millisecond)
def
Go速查表の宣伝記事 cheat sheets
[![go-preview.png](https://cheatsheets.zip/assets/image/go-preview.png)](https://cheatsheets.zip/go)
こんにちは、皆さん!Go言語を学んでいる方々に朗報です!Goの速查表が登場しました!基本的な構文やメソッドをすぐに確認できるので、学習効率がアップします。速查表の詳細は[こちら](https://cheatsheets.zip/go)からチェックしてください。
## 速查表の内容
### はじめに
#### hello.go
“`go
package mainimport “fmt”
func main() {
fmt.Println(“Hello, world!”)
}
“`#### 実行方法
“`sh
$ go run hello.go
Hello, world!
“`または、GoのREPLで試してみてください。
### 変数
“`go
var s1 string
s1 = “Learn Go!”// 複数の変数を一度に宣言
va
【SQL】prepare文って何?
# SQLのPrepare文とミドルウェアの仕組み:
SQLのPrepare文は、パフォーマンスの向上やセキュリティの強化を目的とした重要な技術です。ミドルウェアの仕組みとPrepare文の仕組みを解説します。さらに、PythonとGoでの実装例も紹介します。
## 1. ミドルウェアの解説
多くのミドルウェアは以下の主要なコンポーネント構成について解説します。
1. **パーサー(Parser)**: parse(解析する)+ er(人/もの)= 解析する人
SQLクエリを解析し、構文エラーや文法エラーをチェックします。クエリの構造を内部的な表現に変換します。
例えば、ユーザ情報を管理するテーブルであるuser_infoテーブルがあるとします。
開発者の誰かがよくテーブルを確認せずに以下のようなSQLを書いたとします。
SELECT * FROM users;
上記のクエリは、FROM句に指定すべきテーブル名が誤っています。
この時、「そんなテーブルないよ!?」というエラーが発生しますが、これはパーサーがテーブル情報を見て、「usersテーブルなんてないじゃん!」とエラーを出
Go 1.21 以降のスライスのソート
はじめまして、しろしゅんと申します。
最初の記事としては若干ニッチなテーマですが、Go 言語におけるソートについて書いてみました!
Go を最近始めた方や日頃からよく書く方を想定しています。Go 1.21 で `slices` パッケージが正式に導入され、標準ライブラリでのスライスに対する操作、例えば比較やソート、最大・最小の算出などの機能が拡充されました。
すべての関数でジェネリクスが使用されているため、従来の標準ライブラリに比べ利用者側での書きやすさや拡張性が向上しています。スライスをソートする関数については、従来の `sort` パッケージと比べると、大小関係を判定する関数が `less func(a, b int) bool` から `cmp func(a, b E) int` に変わったことが大きな変更点と言えるでしょう。
この記事では、新しいソート関数の使用例と、従来ソートに使用されていた `less` 関数から `cmp` 関数に変わった経緯などに触れていきます。
## `func SortFunc[S ~[]E, E any](x S, cmp func(
GoのastutilでAST処理をしてみる
前回の記事: [Goの構文解析に入門してみる #Go – Qiita](https://qiita.com/ssc-ynakamura/items/142ce6b729299d82d039)
少し前にGoの構文解析に入門してみたわけですが、前回の記事の最後では[`golang.org/x/tools/go/ast/astutil`](https://golang.org/x/tools/go/ast/astutil)(以下、`astutil`)という便利パッケージがあることに触れました。
今回はこの`astutil`パッケージを使ってみたいと思います。標準の`ast`での処理を踏まえた上での`astutil`なので、前回の記事もご一読いただけると、より一層理解しやすくなるかと思います。
「AST(抽象構文木)って何?」という方も、前回の記事をご一読ください。## 本記事の動作環境
本記事は次の環境で動作確認しながら書きました。
– macOS Ventura
– Go 1.22OSについては特に環境依存はないかと思います。
Goのバージョンについては、大きく離れてい