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

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

【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ファイル内でデータのルールを直接定義できる
– 文字列の長さ

元記事を表示

GitHub ActionsでGolangとProtocol Buffersのコード品質を維持しよう!

# はじめに

ソフトウェア開発においてコード品質を維持することは非常に重要です。コードの品質が低下すると、バグの発生リスクが高まり、保守性や拡張性が損なわれてしまいます。そこで、コードの品質を自動的にチェックするためのツールを導入し、CI/CD パイプラインに組み込むことが有効な対策となります。

この記事では、GitHub Actions のワークフローファイルを使って、Golang のコードとスキーマファイル(Protocol Buffers)の品質をチェックする方法を紹介します。

# ワークフローファイルの概要

以下のワークフローファイルは、2 つのジョブから構成されています。

“`yml
name: Lint for Golang

on:
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 main

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

func main() {
var wg sync.WaitGroup
// 400ミリ秒後にタイムアウトを設定
ctx, cancel := context.WithTimeout(context.Background(), 400*time.Millisecond)
def

元記事を表示

OTHERカテゴリの最新記事