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

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

【Go】スライスにおけるappendのキャパシティ依存の挙動と解決策

# はじめに
* Goのスライスは動的な配列として利用でき、要素数が固定されていないため、柔軟に扱えます
* ただし、`append`を使用して要素を追加する際には、スライスのキャパシティがどのように影響するかを理解しておく必要があります
* 本記事では、`append`の動作がスライスのキャパシティによってどのように変わるかを解説し、そのキャパシティ依存の問題を回避する方法の一つとしてフルスライス式を紹介します

:::note warn
本記事で話さないこと
本記事では挙動の違いについて理解することを重視するため、スライスの内部構造や、ポインタ、Goランタイムの正確な挙動については説明を省略します。

より詳細に知りたい方は、[3. 関数と型 – 3.1. 型 – Gopher道場 -](https://www.youtube.com/watch?v=q92KKz5RsnA)をご覧ください。スライスについては29:47〜、`append`については44:45〜から解説されています。
:::

# appendの基本的な動作

まず、`append`の基本的な使い方を見てみましょう。

元記事を表示

Go(Gin)でのDocker環境構築

# はじめに
今Goのボイラーテンプレートを作っています。マイクロサービスが活発になっているので、
それに伴って作っています。その手始めにDockerの環境構築をしました。

# GoのDocker Image(GinでのDockerの環境構築)
以下のサイトを参考にしてみました。

https://hub.docker.com/_/golang

# まずはGo(Gin)の導入
– Goのインストール
[Goの公式サイト]
https://golang.org/dl/からインストーラーをダウンロードしてインストール。

インストール後、以下のコマンドでGoのバージョンを確認
“`
go version
“`

– プロジェクトのディレクトリを作成
“`
mkdir my-gin-app
cd my-gin-app
“`
– Goモジュールの初期化
“`
go mod init my-gin-app
“`
– Ginのインストール
“`
go get -u github.com/gin-gonic/gin
“`
– 基本的なアプリケーションの作成
“`main.go

元記事を表示

GoでAPIクライアント自動生成とモックを実装してみた

# 背景・目的
以前、Swagger UIをGitHub Actionsで公開しました。その際に利用した設定ファイルを使用してコードを自動生成し、

https://qiita.com/zumax/items/86b0ba27b6f4c06de65c

今回は、`oapi-codegen`について、特徴を整理し、動作を確認してみます。

https://github.com/oapi-codegen/oapi-codegen

また、`uber-go/mock`を使用してモックを生成して単体テストも試します。

https://github.com/uber-go/mock

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

|特徴|説明|
|:–|:–|
|oapi-codegenとは|OpenAPI 仕様を Go コードに変換するためのコマンドライン ツールおよびライブラリ|
|oapi-codegenのメリット|OpenAPI 3.0に基づくサービスの作成や統合に必要な定型文を削減できる。
これにより、ビジネス ロジックの作成と、組織にとっての真の付加価値の創出に注力できる|

元記事を表示

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

元記事を表示

OTHERカテゴリの最新記事