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

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

Echoで固有リクエストヘッダ検証によるCSRF対策

## CSRF対策
CSRF対策で重要なのはユーザーが意図しない動作をブロックすることだと考えました。一般的なCSRF対策としてはCSRFトークンを利用したものがありますが、実装がうまくいきませんでした。色々試行錯誤してる中で、そもそもバックエンドとフロントエンドが独立したSPAでこれが適しているのかどうかという疑問も同時に持ちました。同じような問題の解決方法がMPAに限定されたものばかりだったためです。
https://echo.labstack.com/docs/middleware/csrf

そこで調べているとバックエンドとフロントエンドが独立したSPAでは上の実装が困難であることを見つけ、下記ページで紹介されていた「固有のヘッダの有無を検証する」を試しました。
https://kimuson.dev/blog/フロントエンド/csrf_spa/

## 実装
「固有のヘッダの有無を検証する」middlewareの実装。
middlewareの実装は試行錯誤していた時に見ていたechoの`csrf.go`を参考にしました。
https://github.com/labstack

元記事を表示

【Go】rangefuncでループ終了後にfor文本体を呼び出すとエラーになる

# TL; DR

“`go
var f func(string) bool

func capture(yield func(string) bool) {
f = yield
}

func main() {
for s := range capture {
fmt.Println(s)
}
f(“foo”)
}
“`

“`
panic: runtime error: range function continued iteration after exit
“`

# はじめに

Go1.22のexperimentalの機能として、for文の `range` に関数が使用できるようになりました。
イテレータとして値を生成しながらループをする場合などに便利です。

https://go.dev/wiki/RangefuncExperiment

“`go:
func main() {
// 関数が使える!
for i := range Fact {
if i > 1000000 {
break
}
fmt.Println(i)
}
}

元記事を表示

【30歳/完全未経験/独学】webアプリを作製しました【Golang, Next.js, MySQL, Docker, GitHub Actions CI, AWS Fargate on ECS】

# V-kara開発

はじめまして。

IT業界未経験、プログラミング未経験の状態から独学でwebアプリを作製しました。
きっかけは趣味で使いたいアプリが世の中に無さそうだったことです。
自分用に開発し始めてすぐにのめり込み仕事にしたいと思うようになり、一般向けに開発し直してポートフォリオとしました。

## 自己紹介

– 30歳男
– 理系私大卒
– 生物化学系…コロナでお馴染みとなったPCRもやってました
– バックエンド志望
– 職歴
– 排水処理の薬品・プラントで営業技術6年
– めっき薬品の営業技術2年
– 個人開発1年(一部在職中)
– 2023年末に退職
– ITの理解度
– 2年前まではjavaとjavascriptとHTMLの違いすら知りませんでした

## ポートフォリオ
### 概要
– サイト:[V-kara](https://v-karaoke.com)
V-karaはVTuber(YouTuberの1種)の歌枠の歌情報を登録し、いつでも見返せるwebアプリです。
歌枠とは配信者のカラオケ配信のことで、`どの配信の何分何秒に何を歌ったか

元記事を表示

A Tour of Goエラー:zsh: command not found: gotour

# 概要
A Tour of Goをスタンドアロンで動かそうとした時に出たエラーの解消方法について記載しています。
(所要時間1分)
![スクリーンショット 2024-03-02 16.27.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/8e357352-ce46-dd56-0c68-a91f018a6907.png)

## 今回起きたエラー
記事に書いてある通りに下のコマンドを実行した時にエラーが出ました
“`
go tool tour
“`

エラー:
![スクリーンショット 2024-03-02 16.29.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/d915dd23-8014-ac05-b1ed-365325ea70ff.png)

## 解決方法
下のコマンドを実行
“`
# install
go install golang.org/x/website/tou

元記事を表示

A Tour of Go: Equivalent Binary Trees の回答例

# はじめに
Go を学習し始めの時はあまり納得のいく回答ができなかったが、少し Go にも慣れてきて再度挑戦してある程度納得のいく回答ができたので書き留めます。
※ 実装には基本的な型のみを利用し、`context`といったものの利用は避けています

# 問題の意図
問題文から読み取れる意図をまとめます。
問題文(もしくは Tree のドキュメント)には

> 関数 tree.New(k) は、値( k, 2k, 3k, …, 10k )をもつ、ランダムに構造化 (しかし常にソートされています) した二分木を生成します。

と書かれているので生成される**必ず10個のノードを持つ二分探索木**となります。
実際、`tree` パッケージの `tree.New()` の実装を確認すると確かに10個の値を持つ二分探索木を作成していることがわかります。

つまり、この問題では

– 生成される二分木は二分探索木である
– その二分探索木は必ず10個のノードを持つ

ということを前提として処理を実装してみてくださいという意図があるのかなと思います。

“`go
func New(k i

元記事を表示

ポインタでつまづいたあなたに向けたアドレス空間の世界【Go言語】

# メモリ空間なんて意識してこなかった

私はこれまでPython、JavaScript/TypeScript、PHPといった言語を中心にコーディングしてきました。しかし、仕事の都合上、Go言語の学習が必要になり、少しずつ学び始めてから2週間が経ちました。

その過程で、ポインタの概念に何度も躓いています。私のように他の言語からGoに移行し、ポインタに頭を悩ませる人は少なくないようです。実際、QiitaなどのプラットフォームではGoのポインタに関する記事がたくさん投稿されています。

ポインタに関する説明を読むと、最初は理解できた気になるものの、すぐにそのイメージが掴めなくなってしまいます。これまで高級言語のぬるま湯にどっぷり浸かっていたため、メモリに関連する話題が出ると、認知の負担が爆増し、一度理解したこともすぐに忘れてしまうのです。

そんなわけで、ポインタに限らず、メモリ空間内で何が起こっているのかをしっかりとイメージしながらGoを学んでみたところ、徐々に霧が晴れてきました。付随的にポインタ以外の多くの疑問も解決できたため、その過程の一部を備忘録としてここに記録しておきます。

元記事を表示

[Go] Echo+NginxのDockerCompose環境

# はじめに

Go言語フレームワーク[Echo](https://echo.labstack.com/)のローカル開発環境の簡易テンプレートを作成しました。(目的は、今後触る必要が出たときに速やかに開始するためです。)

https://echo.labstack.com/

[Gin](https://gin-gonic.com/ja/)か[Echo](https://echo.labstack.com/)かで悩みましたが、ドキュメントが整理されている雰囲気があったためEchoを選択しました。[Go言語の本家ではGinが紹介されていますが、それはさておき…。](https://go.dev/doc/tutorial/web-service-gin)

違う言語ですが、PHPの[LaravelのAPIリファレンス](https://laravel.com/api/10.x/index.html)は、リファレンスから該当するフレームワーク内ソースコードまで追いやすいため、かなり親切かと思います。自分の実装の問題か、フレームワークの問題かの切り分けを行う際は、フレームワ

元記事を表示

Go言語のジェネリクスについて

### はじめに
Go言語のジェネリクスは、Go 1.18から導入され、異なるデータ型に対応可能な汎用的な関数や型を作成することができます。他の言語におけるジェネリクスと同様、Goのジェネリクスもまた、型パラメータを用いて抽象化されたコードを書くことができます。たとえば、C#やJavaでは長年ジェネリクスが利用されており、コレクションライブラリなどでその力を発揮していますし、TypeScriptのような言語では、ジェネリクスを使ってより柔軟かつ型安全なコードを書くことができます。
少しサンプルコードを参考として使い方を紹介しようかと思います。

### 考え方
ジェネリクスがよくわからん。という人のために少し説明すると、「型に柔軟性を持たせる仕組み」です。プログラミングするとき、色んなデータ型がありますよね。整数や文字列、あるいはもっと複雑なカスタム型まで。でも、多くの場合、異なる型であっても「同じような処理」をしたい時があります。そこで登場するのがジェネリクスです。簡単に言うと、ジェネリクスを使うと「この関数は、どんな型にも対応するよ」と宣言できるんです。例えば、配列の要素を逆順にす

元記事を表示

Goインストール(goenv)

## 前提

anyenvがインストールされていること

## goenvをインストールする

“`zsh
anyenv install goenv
“`

“`
exec $SHELL -l
“`

## goenvを使ってGoをインストールする

ここでは最新バージョンのGoをインストールする

“`zsh
go_version=$(goenv install –list | egrep -v ‘rc|beta’ | perl -pe ‘s/^ +([0-9]+\.[0-9]+\.[0-9]+)$/$1/’ | tail -n 1)
“`

“`zsh
goenv install ${go_version}
“`

“`zsh
goenv global ${go_version}
“`

“`zsh
goenv rehash
“`

“`zsh
go version
“`

“`:出力
go version go1.22.0 darwin/arm64
“`

元記事を表示

golang 標準パッケージ archive の紹介

# 前提知識

# アーカイブと圧縮の違い
アーカイブと圧縮はどちらもファイルやディレクトリを一つにまとめる手法ですが、それぞれ目的が異なります。

## アーカイブ
アーカイブは複数のファイルやディレクトリをまとめるために使用されます。
ただし、圧縮は行いません。

### Q. 圧縮せず、まとめるだけなんて使い道あるの?

### A. CUIで作業を行う場合は意外とあります。

例えば、`find` で再帰的にファイルを探索する場合、利用しなくなったディレクトリをアーカイブしておくと、探索対象が少なくなり、効率的に探索ができるようになります。

他には、ディレクトリの移動や転送を行う際、配下の構造が複雑だと、扱いが複雑になります。
ここでディレクトリをアーカイブすると、一つのファイルのように扱うことができ、移動や転送が簡単にできるようになります。

## 圧縮
圧縮はファイルを圧縮しサイズを小さくすることが目的です。
よく使われる形式として、zip, gzip, rar などがあります。

圧縮形式にはアーカイブ機能を含むものと、

元記事を表示

フォアグラウンドジョブ/バックグラウンドジョブの実現方法 – シェルもどきをgoで自作する#20

# フォアグラウンドジョブ/バックグラウンドジョブの実現方法 – シェルもどきをgoで自作する#20

## おさらい

– [シェルってなに?コマンドラインインタプリタってなに? – シェルもどきをgoで自作する#1](https://hackmd.io/@jyami/HJzohRn2D)
– [コマンドと引数の分解、環境変数PATHから探索、外部コマンドと内部コマンド – シェルもどきをgoで自作する #2](https://hackmd.io/@jyami/HyeSkkThP)
– [字句解析その1 – シェルもどきをgoで自作する #3](https://hackmd.io/@jyami/Hk3bWSMQO)
– [字句解析その2 – シェルもどきをgoで自作する #4](https://hackmd.io/@jyami/S1BkltxQu)
– [リダイレクションってなに? – シェルもどきをgoで自作する #5](https://hackmd.io/@jyami/S113NQx8u)
– [リダイレクションの種類 – シェルもどきをgoで自作する #6](https://h

元記事を表示

【1年後の1年前は今日ではない!】Go でうるう年に落ちるテストがあった話

# 概要

本日は2024はうるう年で2月29日が追加され、1年が366日ある年です。
そんな2024/02/29に落ちるテストがあっておもしろかったので共有です

# テスト概要

ユーザーの会員期限の再アクティベートのテスト。一度会員になって失効して再度会員になったときに正常に有効化できるか、というような旨のてすとです。

1. 失効期限を今日から1年後にする
1. 失効期限を1年前に戻す
1. 期限が切れていることを期待する
1. 再度アクティベートする

という流れの3でうるう年の今日だけ有効期限が切れなくなっていました。

# 原因

Golang でうるう年2/29の1年後を取得すると、翌年の2025年は2/29 がないので3/1 に繰り上げされ、1年後の1年前が今日じゃなくて翌日になっていたため!

例:

**1/ 失効期限を今日から1年後にする**
→ 2025年に2/29 はないので3/1

**2/ 失効期限を1年前に戻す**
→ 2025年3/1 だったので2024 3/1 になる

**3/ 期限が切れていることを期待する**

Now() = 2029 2

元記事を表示

asdfでWSL+UbuntuにGoをインストール

# はじめに

以前インストールしたプログラミング言語管理ツールのasdfを使って、WSL UbuntuにGoをインストールします。

# 前提環境

https://qiita.com/perilla/items/69bc6f89001dbceb0cde

https://qiita.com/perilla/items/ef73cf57ade24bc94f19

# asdf更新

asdfを更新します。

“`sh:Ubuntu
asdf update
“`

# Goの存在確認

“`sh:Ubuntu
asdf plugin list all | grep -e golang
# golang https://github.com/asdf-community/asdf-golang.git
“`

https://github.com/asdf-community/asdf-golang.git

# asdfにGoを追加

“`sh:Ubuntu
asdf plugin add golang
“`

# 依存パッケー

元記事を表示

フロントNextjsで入力した文字をGinで受け取りRedisに登録

# やりたいこと
フロント側で入力した文字をバックエンドに送信して、データベースに登録する

## 環境構築

https://qiita.com/zukka/items/5a6831bef702d8c910e0

https://qiita.com/zukka/items/f019b7a384feaf03c65a

## フロントエンド
フォルダ・ファイル作成
個別用にlayoutファイルとCSSモジュールを作成

“`
react/src/
┣ app
┃ ┗ input-text
┃ ┣ page.tsx
┃      ┣ layout.tsx
┃      
┗ components
    ┗ ui-elements
┗ input-test.module.css

“`
### page.tsx
ページ表示部分

“`react
“use client”;

import axios from “axios”;
import { useState } from “react”;

// CSS Modulesの読み込み
import styles fr

元記事を表示

Datadog APMで測定するアプリケーションパフォーマンス

# 運用で困っていること

– インフラで発生するインシデント(メールが送られない、画面表示が遅いなど)が発生しても、即座の原因特定が難しい
– イベント(画面表示やデータ登録)ごとの発生頻度や利用時間帯がつかめない
– 時系列的に記録されたログでは、複数同時に来るリクエスト処理がごちゃごちゃに記録され、特定の関心のあるリクエストだけを追うのが難しい
– 処理が複数のサービスに分散されていると、関心のある処理を追いづらい

# Datadog APMとは

– Datadog社が提供する、アプリケーションのパフォーマンスをリアルタイムで監視し、分析するためのツール(SaaS)
– ユーザーのリクエストがシステムを通過するパスを追跡し、各モジュールでの処理時間を把握できる
– アプリケーションのパフォーマンスを監視し、異常が発生した場合に検知
– 詳細なレポーティング
– 分散システムのサポート

# 実際に組み込んでみた

ソースコードでライブラリを組み込む必要がある(Goの場合)

“`go
// アプリケーション開始時
tracer.Start(tracer.WithServic

元記事を表示

Gin Web Frameworkでのnpmライブラリを使った静的ファイルの取り扱いに関するメモ

[Golang フレームワークでStaticファイルをemmbeddingして](https://gin-gonic.com/docs/examples/serving-static-files/)をnpmライブラリを使いたい。例えば[http-status-code](https://www.npmjs.com/package/http-status-codes)など。

ハマったのでメモします。

## 解決策

具体的には、サーバーサイドで

“`go:main.go
r.StaticFS(“/node_modules”, http.Dir(“static/node_modules”))
“`

クライアントサイドで

“`typescript:main.ts
import { StatusCodes } from “../node_modules/http-status-codes/build/es/status-codes.js”
“`

ライブラリはあらかじめ`npm`使ってインストールしておく必要がある。

“`sh
$ npm install -D http-

元記事を表示

Goのentでスキーマに変更があったときにGithub Actionsで自動的にマイグレーションファイルを作成するWorkflow

諸処の事情で不要になった代物ですが、自分の備忘録代わりに残しておきます。

## モチベーション
チーム開発でGo言語のORMツールであるEntを使っていると、わりと他人のマイグレーションを取り込み忘れて開発しちゃったテヘ!という事態に遭遇することがあります。
それをなるべく自動で回避するために、自分のPRがマージされたときに、Github Actionsを使って勝手に開発のベースブランチ(今回はdevelop)にマイグレーションファイルを作成・commit・pushしてしまおうというワークフローです。

## 前提条件

* Entのマイグレーションにはdbmateを使用
確かRuby on RailsのActiveRecordのmigrationぽく使える(マイグレーションとロールバック用のSQLどっちも生成される)という理由で採用したような記憶があります。TypeScriptのPrismaのマイグレーションファイルに移植しやすいからという理由もあったような気がします。

* 2022年くらいの実装
ちょっと情報が古いかもなので、適宜アップデートするともっと良いソリューションがある

元記事を表示

[翻訳転載] Golang Tip #14: エラーメッセージを大文字で始めたり区切り記号で終えたりしない

# はじめに

https://qiita.com/a10a/items/5063899c9f4a3bf4a2f2

本記事は以下のツイートの翻訳転載です。

https://x.com/func25/status/1755232851401076925?s=20

# エラーメッセージを大文字で始めたり区切り記号で終えたりしない

これは、最初は少し変に見えるかもしれないですが、実用的な理由があります。

**なぜ小文字で始めるのでしょうか?**

エラーメッセージは他のメッセージと組み合わされることがあります。

もしエラー文字列が大文字で始まっていると、それが文の途中に挟まれたときに不自然に見えたり、場違いに見えたりします。

![image](https://pbs.twimg.com/media/GFvVNPvbYAAX3-r?format=jpg&name=medium)

エラーメッセージを小文字で始めると、組み合わされたメッセージに、そのメッセージをより自然になじませることができます。

“` console
// application startup failed

元記事を表示

[翻訳転載] Golang Tip #13: 空スライスとnilスライス

# はじめに

https://qiita.com/a10a/items/5063899c9f4a3bf4a2f2

本記事は以下のツイートの翻訳転載です。

https://x.com/func25/status/1754852685369524574?s=20

# 空スライスとnilスライス

値を持たないスライスを使用するには2つの方法があります。

– **`var`の使用: `var t []int`**

この方法は`int`型のスライス`t`を初期化せずに宣言します。
このスライスはnilとみなされます。

これは、実際には基底となる配列が存在しないことを意味します。
スライスの長さ (`len`) と容量 (`cap`) はどちらも`0`です。

**- リテラルの使用: `t := []int{}`**

`var`の使用とは異なり、このスライスは`nil`ではありません。
これは要素を持たない配列を基底するスライスです。

**さて、慣例とみなされるのはどちらでしょうか。**

1 . **nilスライスはメモリを割り当てません**

空スライスが基底となる配列に

元記事を表示

Github ActionsでもPrivate Repoをgo getしたい

# 目的
CIを回している時に、プライベートリポジトリの`go get`に失敗したので、それを解決します。
普段ローカルでプライベートリポジトリをインポートする際、`GOPRIVATE`環境変数を利用しているかと思いますが、同様のことをCI環境(Github Actions)で行うといった内容です。

# 準備
Githubの自動トークン認証を使います。
Personal Access Token(PAT)はセキュリティ的な観点から利用しません。
自動トークン認証は`${{ secrets.GITHUB_TOKEN }}`で一時的なトークンを発行できます。権限はPATより弱いですが、`go get`するには十分です。

https://docs.github.com/ja/actions/security-guides/automatic-token-authentication

# 解決方法
このように指定すると解決されます。
“`
run: |
git config –global url.”https://github-actions:${{ secrets.GIT

元記事を表示

OTHERカテゴリの最新記事