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

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

ChatGPTを使って簡単なSPAを実装すると、どのくらい時間がかかるのか

# 1. はじめに
生成AIでアプリ開発する記事を見かけて、今更ながら生成AIによるコーディングに興味が湧きました。そこでChatGPTを使って簡単なTodoアプリの実装をすると、どのくらい時間がかかるのか、タイムアタックをしてみることにしました。FrontendはVue.js、BackendはGo、DatabaseはPostgreSQLで作成しました。

結論から言うと、大体5時間くらいで完成しました。完成品のクオリティを見て、「このクオリティに5時間かかったのか」と自分でも思う一方、不慣れなところが多く詰まりまくったにも関わらず5時間でできたことに驚いています。

完成品は[こちら](https://github.com/utibori-jp/simple-todo)のレポジトリにあげてるので、興味あれば是非。

# とりあえずやってみる

早速ChatGPTにお願いしていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769595/65bcc8a5-066b-651c-1f

元記事を表示

MacOSからDatadog APMを送る (with Datadog Agent)

## 概要

DatadogのTraceを、アプリのローカル実行で確認したいケースがある。
今回は、Mac上にDatadog Agentを立てて、Datadogにトレースを送るのを試す。

## インストール

https://app.datadoghq.com/account/settings/agent/latest?platform=macos から Agentの設定をしていきます。

![Screenshot 2024-10-26 at 9.10.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7059/dffb566e-2ebc-3122-980a-7e5ea3c93979.png)

DD_API_KEYを取得してから、以下のコマンドでインストールすることができます。

“`
DD_API_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX DD_SITE=”datadoghq.com” bash -c “$(curl -L https://install.da

元記事を表示

Go言語とJavaScriptで数値を人にやさしく表示する方法

# はじめに

Go言語とJavaScriptで開発するプログラムから数値を表示する時、人にやさしく表示するためのパッケージをの紹介です。バイト数をMBやGBにしたり、大きな数値をカンマ区切りで表示するためのものです。
82854982Bytesより82MBのほうが直感的にわかりやすいです。
6582491という数値よりも、6,582,491のほうがわかりやすいというものです。

# Go言語のパッケージ

Go言語は、go-humanize

https://github.com/dustin/go-humanize

です。

サンプルプログラムは

“`go
package main

import (
“fmt”
“time”

“github.com/dustin/go-humanize”
“github.com/dustin/go-humanize/english”
)

func main() {
// バイト数
fmt.Printf(“That file is %s.\n”, humanize.Bytes(82854982)) // That file i

元記事を表示

[Go]Genericsを使ってWebアプリの共通処理をまとめて行う

最近、[Fiber](https://gofiber.io/)というWeb Application FrameworkでWebアプリを作っていますが、そこでGenericsを使ってWebリクエストを処理する「お約束」みたいな共通処理をまとめてやっています。

Fiberじゃなくても使えると思いますが、Fiberを例にしています。なお、Fiberは現在v3がベータ版ですが、以下はv2のコードです。

## リクエストごとに型を作る

最初にリクエストごとの型を作ります。

“`go
type TestGetApiReq struct {
Name string `json:”name” query:”name”`
}

type TestPostApiReq struct {
Country string `json:”country”`
}
“`

GETのほうは、QUERY_STRINGとして渡されることを想定しています(`json:”name”`は、レスポンスに使うためなので、普通は不要です)。POSTの方は、RequestBodyにJSONがくる想定です。
Fiberでは

元記事を表示

勉強会に参加してみたらエンジニアの尊さを感じた話 ~ Go Connect ~

株式会社Schoo 新卒1年目の [@hiroto_0411](https://x.com/hiroto_0411)です!
今回は、Go Connectという「Go言語の勉強と交流」を目的とした勉強会に参加してきたので、そのレポートを書いてみました。
一方的に「学ぶ」だけでなく、「交流」を通して「学ぶ」ことができる勉強会の設計になっていて、 **他者との交流を通して学び合うエンジニアコミュニティの文化って尊いなぁと感じることができる勉強会でした** 🫶

企画・運営してくださった方々、会場を提供してくださった株式会社LayerXさんありがとうございました!

https://gotalk.connpass.com/event/331992/

## この記事でわかること
– この勉強会でどんなことしたの?
– エンジニアの「学び合う」文化って尊いよね

## おすすめされていた本
勉強会が始まる前に1人ずつ自己紹介する時間があり、そこでは毎回自己紹介のテーマを決めているらしいのですが、今回は「おすすめの書籍を紹介する」というテーマでした。自己紹介からも「学び」を得ることができて素敵

元記事を表示

Go の 型が interface を満たすことを保証する

# 型を満たすことが保証されていない場合

例えば以下のような実装があるとします。

“`main.go
package main

func main() {}
“`

“`tasks.go
package main

type Tasks interface {
Create(task string)
Get(id int)
Update(id int, task string)
Delete(id int)
}
“`

ここで定義した `Tasks` interface を `Update(id int, task string)` メソッドを除いて満たすように実装します。

“`tasks_impl.go
package main

type TasksImpl struct{}

func (t TasksImpl) Create(task string) {
//TODO implement me
panic(“implement me”)
}

func (t TasksImpl) Get(id int) {
//TODO implement me

元記事を表示

Goのtime.AddDate()で月加算がズレる件の対処方法

## 概要

time.AddDate()で月末の月加算がずれることに気づいた際のメモ

下記の記事がとても参考になりました

[https://tech.mirrativ.stream/entry/2023/10/31/120000](https://tech.mirrativ.stream/entry/2023/10/31/120000)

## 問題点

– time.AddDate()で月末の月加算がずれる
– 12月末 + 2ヶ月 = 2月末としたいが、3/2や3/3となる

“`go
func main() {
start := time.Date(2023, 12, 31, 0, 0, 0, 0, time.UTC)
twoMonthLater := start.AddDate(0, 2, 0)

fmt.Println(twoMonthLater)
}

// 出力: 2024-03-02 00:00:00 +0000 UTC
“`

## 解決方法

– 独自に月を加算する関数を作成

“`go
// AddMonthsPreservingE

元記事を表示

ecsからrdsにrds proxyを挟まずに直接接続する際のssl/tls証明書について

通常はrds proxyを介してRDSに接続を行っていたが、今回はrds proxyを介さずに直接RDSに接続を行った。

その際に、
“`
failed to initialize database, got error tls: failed to verify certificate: x509: certificate signed by unknown authority
“`
が発生した。

これを解決するために以下公式ドキュメントを参照して証明書バンドルをインストールした。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html

自身のリージョンによる証明書のバンドルをダウンロードし、作業ディレクトリに配置する。

CA証明書を読み込み、カスタムTLS設定に登録を行う。

“`Go
import (
“crypto/tls”
“crypto/x509”
“fmt”
“io/ioutil”
“log”

“sample/domain”

元記事を表示

Airを使うとGO言語開発が楽に

## 発信しようとしたきっかけ
個人開発、又は実務においてコードに変更を加えるたびにビルドをし直すのは面倒ですよね?
そんな時GO言語では**Air**と呼ばれるソフトウェアを使うことが多いように思われます。
主にインストールでつまづいたため備忘録として記事を残そうと思います。

https://github.com/air-verse/air

## **Air**
APIサーバーを開発する際に「ソースコードの変更をする度にビルドする必要がある」
という問題を抱えていて開発効率を落としてしまいます。

そこで開発されたのがAirです。
開発者はGoのAPIサーバーを開発時に「コードの変更を監視して変更された際に自動的にビルドをし直しアプリケーションを再起動するホットリロードライブラリ」となっています。

ホットリロードとは、ソースコードを更新するたびにソースをビルドし直して実行するという手間を省くため、ソースコードを更新し、保存したら自動でビルドと実行を行うということです。

プロジェクトのルートディレクトリでairを実行し、放っておくだけでコードに集中できるというわけです

元記事を表示

go workspaceで`go mod tidy`が失敗するのを回避する

# はじめに
go言語のworkspace機能を利用中、`go mod tidy`コマンドを実行したところ、エラーが発生しました。
workspace内で使用しているパッケージが、ローカルにしか存在しなかったため、パッケージをリモートから取得できずエラーになっていたようです。

workspace内限定の依存関係というのは珍しくなく、むしろworkspace機能を使用している目的の場合もあると思います。
そういうったプライベートな依存と通常のパブリックの依存が入り混じった状況で、依存関係を自動で整理してくれる`go mod tidy`が使えないのは不便です。
回避策がありますので、紹介します。

# この記事で伝えたいこと
`go mod tidy`コマンド実行時、エラーを無視する`-e`オプションを追加します。
“`shell
$ go mod tidy -e
“`
> The -e flag causes tidy to attempt to proceed despite errors
encountered while loading packages.

issueも立っ

元記事を表示

OPTiM × every Golang Developer Night (240702)に参加してきました

2024/07/02 OPTIMさんのオフィスで開催されたGo言語のイベントにリアル参加してきましたので、お聞きしたLT内容など、メモを元にご紹介します。

※ **3ヶ月寝かせていた記事です、もう加筆できる気がしないのでこのまま公開してしまいます。**
※ 間違い/解釈違いが含まれる可能性もあるのでご注意ください。もしお気づきの点あればそっとコメントで教えて頂けると嬉しいです。

## イベント概要
様々な産業DXを実現する自社サービスを展開する[株式会社オプティム](https://www.optim.co.jp/)さんと、食、子育て、地方創生の課題に向き合うプラットフォームを展開する[株式会社エブリー](https://corp.every.tv/)さんの2社で共同開催された、2~30人規模のGo言語系のLTイベントでした。

### Connpass
https://optim.connpass.com/event/321331/

## LT・セッション

### Go x LLMで新たなコード生成の可能性を探る (今枝さん)
Goで一般的なコード自動生成ツールと、LLMを

元記事を表示

サイトを要約して保存するショートカットを作成しました。

# 要約
ショートカットでサイトを要約し、あとから検索できるchrome拡張機能を作成しました。
# 経緯
一年前にGo言語でサーバーを作る練習をしており、ちょうど、Chromeのブックマーク機能の、タイトルだけ表示されてなんのサイトかわからなくなる点などに不満があったことから、自作することにしました。当時はガチガチに完成度を上げることにこだわっていたのと、ChatGPTの文字数(トークン)制限が厳しかったのもありやめてしまったのですが、思い立ってローカルで動く形に仕上げました。
# 構成
drawioでササッと作っただけですが、構成は以下の図のようにシンプルな形です。Goサーバーを中心として、拡張機能から保存したいウェブサイトを送信すると、サーバーにサイトと要約が保存されます。検索用ウェブサイトを利用してウェブサイトを検索できます。
![スクリーンショット 2024-10-22 18.54.30(2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1829579/9bfd7969-30e3-a486-

元記事を表示

Go基礎的なコードの書き方まとめ(初心者用)

# はじめに
Go(Golang)は、シンプルで効率的な開発を可能にするプログラミング言語!らしい、、、
本記事ではGo初心者の方に向けて、Goで開発を行う際に知っておくべき基礎的なコードの書き方について解説します:koala:

# 基本的なコードの書き方
1. パッケージ宣言とインポート
Goのファイルはパッケージ宣言から始まります。必要な外部パッケージはimport文を使ってインポートします。
“`go
package main

import (
“fmt”
)
“`

2. エントリーポイント
Goプログラムは、mainパッケージのmain関数から実行されます。
“`go
func main() {
fmt.Println(“Hello, World!”)
}
“`

3. 変数と定数の宣言
変数と定数はvarおよびconstキーワードを使って宣言します。
“`go
var x int = 10

元記事を表示

【GO】go:embedを利用して埋め込んだ秘密鍵をGithubActionsで利用する方法

# はじめに
GOの勉強で、JWTの生成を実装していました。
JWTの生成で使う秘密鍵と公開鍵は、go:embedを利用して埋め込む方法を取りました。
そして、秘密鍵と公開鍵は、セキュリティの問題があるのでGitHubにはコミットしないようにしました。
この場合、GithubActionsで、LintやTestが失敗するので、どうすればいいか調べました。

結論から言うと、GithubActionsには、シークレットという変数を登録して、GithubActionsを実行中に使える機能があるので、それを使います。
具体的には、秘密鍵と公開鍵の中身を変数として登録し、GithubActionsを実行するときに変数の中身を秘密鍵と公開鍵のファイルとして、出力するという方法となります。

# GOのコード
GOのコード側では以下のように秘密鍵と公開鍵を利用しています。

“`go
//go:embed cert/secret.pem
var rawPrivKey []byte

//go:embed cert/public.pem
var rawPubKey []byte
“`

# シー

元記事を表示

GoでCobraを使ってCLIを作成してみた

# 背景・目的
最近、CobraというCLIアプリケーションを作成するライブラリを知りました。
今回、整理し簡単に試してみたいと思います。

# まとめ
下記に特徴を整理します。

|特徴|説明|
|:–|:–|
|Cobraとは|強力な最新の CLI アプリケーションを作成するためのライブラリ
Kubernetes、Hugo、GitHub CLI など、多くの Go プロジェクトで使用されている|
|概要|git や go ツールに似た強力な最新の CLI インターフェースを作成するためのシンプルなインターフェースを提供するライブラリ|
|提供する機能|・簡単なサブコマンドベースの CLI: アプリサーバー、アプリフェッチなど
・完全にPOSIX準拠のフラグ(短いバージョンと長いバージョンを含む)
・ネストされたサブコマンド
・グローバル、ローカル、カスケードフラグ
・インテリジェントな提案
・コマンドとフラグの自動ヘルプ生成
・サブコマンドのヘルプのグループ化
・-h、–help などのヘルプ フラグの自動認識
・アプリケ

元記事を表示

gRPCってなに?サーバーを作りながら理解してみよう

株式会社Schoo 新卒1年目の [@hiroto_0411](https://x.com/hiroto_0411)です!
最近、業務でgRPCサーバーの実装を行うことになったのですが、gRPCに触れたことがなかったのでgRPCのサーバーを作りながら概要と実装方法をまとめてみました!

## この記事でわかること
– gRPCってなに?
– gRPCサーバーを作る流れ

## gRPCとは
Googleが開発したオープンソースのRPCフレームワーク

### RPCとは
Remote Procedure Callの略。直訳すると遠隔手続き呼び出し。クライアントから別のサーバーの関数・メソッドにリクエストを送り、そのレスポンスを受け取ること。別のサーバーにある関数・メソッドを呼び出して使うようなイメージ。

gRPCのイメージ
![スクリーンショット 2024-10-17 0.44.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810533/d405e460-3c66-6870-4511-fc3

元記事を表示

grpc-gatewayってなに?実装しながら理解してみよう

株式会社Schoo 新卒1年目の [@hiroto_0411](https://x.com/hiroto_0411)です!
最近、gRPCサーバーの実装を行っていく中で、grpc-gatewayというのがあると知ったので実装しながら理解を深めてみました!

## この記事でわかること
– grpc-gatewayってなに?
– grpc-gatewayを使った、gRPCサーバーを作る流れ

gRPCについて理解が曖昧な方は以下の記事にまとめたのでこちらを先に見ていただくと、この記事が理解しやすくなると思います。

https://qiita.com/hiroto_0411/items/e87b626878d288460d62

## grpc-gatewayとは
.protoファイルを元に、REST APIに送られてきたリクエストを変換して、gRPCサーバーに転送するためのリバースプロキシーサーバーを作ることができるプラグイン。

**リバースプロキシーサーバー**
クライアントからのリクエストを別のサーバーに転送するサーバー

イメージ
![スクリーンショット 2024-10-17

元記事を表示

Go 言語スプレッドシートライブラリ:Excelize 2.9.0 がリリースされました

![Go 言語スプレッドシートライブラリ:Excelize 2.9.0 がリリースされました](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144042/49bd24c6-1ee2-5a4c-8e48-451a76ec9532.jpeg)

Excelize は、純粋な Go で記述されたライブラリで、XLAM / XLSM / XLSX / XLTM / XLTX ファイルの読み書きを可能にする一連の関数を提供します。Microsoft Excel™ 2007 以降で生成されたスプレッドシートドキュメントの読み取りと書き込みをサポートします。高い互換性により複雑なコンポーネントをサポートし、大量のデータを含むワークシートからデータを生成または読み取るためのストリーミング API を提供します。このライブラリには Go バージョン 1.18 以降が必要です。

場合によっては、既存の Excel ドキュメントコンテンツの読み込み、新しい Excel ドキュメントの作成、既存のドキュメント(テンプレート)に基づく

元記事を表示

ToDoアプリの作成(マイグレーション編)

はじめに

Udemyの講座「Echo/Go + Reactで始めるモダンWebアプリケーション開発」を基にEcho/Goの部分だけにはなるのですが、勉強した内容をまとめていこうと思います。
長くなるので何回かに分けてブログを執筆しようと思っています。

プロジェクトの作成

まずはVSCodeにてフォルダ(GO-REST-API)を作成し,下記コマンドを実行し新しくGoのプロジェクトを作成します。

“`go mod init go-rest-api“`

ローカルでPostgreSQLを起動

ローカルでpostgresを起動するため、プロジェクト直下にdocker-compose.ymlファイルを作成します。

“`docker:docker-compose.yml
version: “3.8”
services:
dev-postgres:
image: postgres:15.1-alpine
ports:
– 5434:5432
environment:

元記事を表示

Goの気になり

仕事でGoを使うようになって1年ほどたったので、その中で若干気になっていることをまとめてみる。

## ポインタの使いどころ
ポインタによる変数の受け渡しは値のコピーをせずアドレスを渡すだけですむが、ガベージコレクションに負荷がかかりおおくのCPU時間を消費する可能性があるらしい。

どういうときに使うのか
– 引数やレシーバを関数内で書き換える必要がある場合
– コピーを避けたいデータを引数、レシーバにする場合
– 大きな構造体や配列を扱う場合
– 大きな構造体をスライスに持たせる場合

3つ目、4つ目の大きな構造体の大きいの基準とは?と思っていたところ、ちゃんと記述があった。
構造体のフィールドの値すべてを引数に取る関数を考え、多いと感じるかどうかで考えるといいらしい。

[Goにおけるポインタの使いどころ](https://zenn.dev/uji/articles/f6ab9a06320294146733)
[golang の 引数、戻り値、レシーバをポインタにすべきか、値にすべきかの判断基準について迷っている – pospomeのプログラミング日記](https://www.

元記事を表示

OTHERカテゴリの最新記事