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

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

go.modが作成されない🔰

go mod init

go mod tidy

上記コマンド実行後の結果です

MacBook-puro todo_app % go mod init

go: cannot determine module path for source directory /Users/miya/Desktop/未定義/todo_app (outside GOPATH, module path must be specified)

Example usage:

‘go mod init example.com/m’ to initialize a v0 or v1 module

‘go mod init example.com/m/v2’ to initialize a v2 module

Run ‘go help mod init’ for more information.

MacBook-puro todo_app % go mod tidy

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
go mod init 任意のモジュール名(部品名)

go mod tidy

元記事を表示

Golangの構造体の初期化方法~FunctionalOptionパターン編~

Golangで構造体の初期化をしようとすると、しばし**FunctionalOptionパターン**というデザインパターンの記事を見かけます。
Javaで開発してきた人にとって構造体の初期化は**Builderパターン**を用いることが多いためあまり馴染みのない言葉なのではないでしょうか?

今回はGolangの特性を活かした**FunctionalOptionパターン**が何なのか説明していきます。

# FunctionalOptionパターンとは
オブジェクトの構成や初期化時に柔軟性と読みやすさを提供するために使われるデザインパターンです。特にGo言語で広く利用されています。
**最大のメリットは、FunctionalOptionパターンを使用すると、クライアントコードは必要なオプションのみを指定して構造体の初期化をすることができる**ところにあります。
また**構成が非常にシンプルで、可読性が高い**といった特徴があります。

# 基本的なアプローチ

結論としては以下のようなコードです。ユーザー情報の構造体を初期化する処理を想定したコードです。
実装手順については後ほど説明

元記事を表示

Go言語の基礎 S2

# Go言語の文法

## 変数

### 型の種類
|型の名前|説明|サイズ|範囲|
|-|-|:-:|:-:|
|bool(boolen)|論理値型|1byte|“true“/“false“|
|string|文字列型|-|-|
|float32|単精度浮動小数点数|4byte|有効桁数6桁の実数|
|float64|倍精度浮動小数点数|8byte|有効桁数14桁の実数|
|int32|符号付き整数|4byte|-2147483648 ~ 2147483647|
|int64|符号付き整数|8byte|-9223372036854775808 ~ 9223372036854775807|
|int|符号付き整数|4byte / 8byte|“int32“または“int64“と同じ|
|rune|int32のエイリアス|4byte|Unicodeのコードポイント1文字分を格納|
|complex64|複素数|8byte|“float32“の実数部と虚数部を持つ複素数|
|complex128|複素数|16byte|“float64“の実数部と虚数部を持つ複素数

元記事を表示

Go言語の基礎 S1

# Go言語の導入
これらの記事を書くにあったって、Go言語の初心者向けのサイトを作成してもらったすべての人に感謝を表し、これを謝辞とさせていただく。

## Go言語の特徴
* コンパイル型言語
* 静的型付け言語
* 並行処理に強い
* C言語みたいに一文かいたらセミコロン(;)というのはない
* C言語などの言語と少し似ているため他の言語と少し似ている部分があり理解しやすい
* try-catchがない

## 学習サイト

### A Tour of Go

https://go-tour-jp.appspot.com/list

Goの公式が出しているもの。日本語訳されていてすでに他の言語を触ったことがある人ならこれをすべき!!

### Progate(プロゲート)

https://prog-8.com/courses/go

他の言語を触ったことがない、または初心者の方はこのサイトから始めるとよいだろう。一部**有料**という欠点はあるが、わかりやすいのでおすすめである。

## Go言語の環境構築

https://go.dev/dl/

上記のサイトから環境にあった

元記事を表示

はじめてのgRPC

業務で使う機会があり、ちゃんと理解したいなと思いやってみました。

## gRPCとは?
“`
Remote Procedure Call
“`
別の場所にある・別のサーバにあるProcedureを呼び出すものです。
それがRPCでそのRPCをGoogleが使えるようにしたものがgRPCです。

## gRPCのメリットとは?
gRPCを使うかというと以下のようなメリットがあります。

1\. 高性能と効率性
– Protocol Buffers(プロトコルバッファー)を使って通信をすることで高速に通信することができる
– JSONやXMLより軽量で速い
– HTTP/2を利用することでヘッダーの圧縮やストリームの多重化をすることができる

2\. 言語とプラットフォームの独立
– 多数のプログラミング言語で利用可能
– なので、システム間の連携とかもしやすい

3\. 強力な型付け
– プロトコルバッファーを使うことで型をちゃんとつけることができる

4\. ストリーミングサポート
– 以下のようなストリーミング機能をサポートしている
– クライアントストリーミング

元記事を表示

チャネル「右から、右から何かが来てる〜」

# 僕はそれを左へ受け流す〜

Go言語のチャネルの書き方を歌詞にした歌があったので紹介します。チャネルの使い方が覚えられない方の助けになれば幸いです。

“`go: チャネルの使い方
package main

import (
“fmt”
)

func main() {
ch := make(chan int)

go func() {
// 右から、右から何かが来てる〜
ch <- 1 }() // 僕はそれを左へ受け流す〜 a := <-ch fmt.Printf("右から来て左に受け流されたもの 👉 %d\n", a) } ``` ```:出力 右から来て左に受け流されたもの 👉 1 ```

元記事を表示

[Go]カバレッジ計測結果ファイルのデータサイズ抑制

# 問題
CircleCI で codecov の Orb([codecov/codecov](https://circleci.com/developer/ja/orbs/orb/codecov/codecov))を使い、go testでデフォルトのフォーマットで出力したカバレッジ計測結果のファイルをアップロードする際に、以下のようなエラーが発生していた。

**CircleCIのログ**
“`
[yyyy-mm-ddTHH:MM:SS.SSSZ] [‘info’] Could not read coverage file (<カバレッジ計測結果のファイルパス>): Error: There was an error reading the coverage file: Error: Cannot create a string longer than 0x1fffffe8 characters
“`

調査した結果、codecov の Orb は nodejs をベースにしているのだが、入力ファイル(=カバレッジ計測結果のファイル)を読み込んだ段階で [nodejs の文字列サ

元記事を表示

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年(mac)
– めっき薬品の営業技術2年(windows)
– 個人開発1年(一部在職中)
– 2023年末に退職
– ITの理解度
– 2年前まではjavaとjavascriptとHTMLの違いすら知りませんでした

## ポートフォリオ
### 概要
– サイト:[V-kara](https://v-karaoke.com)
V-karaはVTuberの歌枠の歌情報を登録し、いつでも見返せる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
“`

# 依存パッケー

元記事を表示

OTHERカテゴリの最新記事