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

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

Mattermost のカスタムPlugin を開発してみる

## 1.はじめに

自社製品をバックエンドとして、Mattermostでチャットボットを開発する必要があり調査したところ、以下の選択肢があることがわかりました。

1. [Outgoing Webhook](https://developers.mattermost.com/integrate/webhooks/)
特定のチャンネルで特定のトリガーワードが投稿された際に、外部のURLにHTTP POSTリクエストを送信できる
特徴:
– トリガー条件: 指定したチャンネルでの投稿、または特定のトリガーワードに一致する投稿
– 利用可能なチャンネル: パブリックチャンネルのみ
– プライベートチャンネルやダイレクトメッセージでは使用不可

1. [スラッシュコマンド](https://developers.mattermost.com/integrate/slash-commands/)
ユーザーがチャット入力欄で「/」から始まるコマンドを入力することで、特定のアクションを実行できる
特徴:
– トリガー方法: ユーザーが手動でコマンドを入力
– 利用可能

元記事を表示

ToDoアプリの作成(バリデーション編)

はじめに

今回は,前回に続き外部パッケージのozzo-validationを使ってバリデーションの実装を行っていきます。

https://qiita.com/sawadashinji0526/items/816646ed12200ab76084

バリデーションの実装(タスク)

タスクのバリデーション処理を実装します。

“`validator/task_validator.go
package validator

import (
“go-rest-api/model”
//外部パッケージなのでgo mod tidyコマンドを実行してダウンロードします。
validation “github.com/go-ozzo/ozzo-validation/v4”
)

type ITaskValidator interface {
//タスクのバリデーション処理を実行するメソッドです。
//バリデーション対象のタスクです。
//バリデーションエラーが発生した場合に返されるエラーです。
TaskValidate(t

元記事を表示

[更新中] [golang] メモリ管理における重要な知識

# 目的
golang のメモリ管理における重要な点をまとめる。

# 注意
golang において、値がスタックとヒープどちらに置かれるのかは、明示的に決まっておらず、バージョンによって異なる可能性もある。

# リンク一覧
## インライン展開

https://qiita.com/ShiroatoHiro/items/bcd4312e33f862a904e2

## 値のサイズ
### サイズの大きさ

https://qiita.com/ShiroatoHiro/items/cd19e2905efc886230ca

### サイズが未知か既知か

https://qiita.com/ShiroatoHiro/items/1bae8bd95d12acf9b586

## スタックフレーム

https://qiita.com/ShiroatoHiro/items/95b7c34b92d8d9420084

## グローバル変数

https://qiita.com/ShiroatoHiro/items/b6bd07d64360adc60403

## 確定でヒープになる値

h

元記事を表示

[golang] 値のサイズが、配置されるメモリ領域(ヒープ or スタック)に影響を及ぼす可能性があることを理解する。

# 目的
値のサイズが、配置されるメモリ領域(ヒープ or スタック)に影響を及ぼす可能性があることを理解する。

# 環境
“`
$ go version
go version go1.23.2 linux/amd64
“`

# 検証
## (1) 値のサイズが小さく、スタックに置かれるパターン
“`
package main

const size = 64 * 1024

func main() {
_ = make([]byte, size)
}

“`
“`
package main

import “testing”

func Benchmark(b *testing.B) {
for i := 0; i < b.N; i++ { main() } } ``` ``` $ go build -gcflags "-m=2" . # gopractice ./main.go:5:6: can inline main with cost 4 as: func() { _ = make([]byte, 65536) } ./main.go:6:10: ma

元記事を表示

[golang] インターフェースが確定でヒープに割り当てられるというルールはない

# 目的
インターフェースが確定でヒープに割り当てられるというルールは特にないということを理解する。
下記の記事で、インターフェースは確定でヒープに配置されるという旨の記述があったので検証してみた。かなり古い記事なので、昔の golang はそういう仕様だったということかもしれない。

https://najeira.blogspot.com/2013/10/go.html

# 環境
“`
$ go version
go version go1.23.2 linux/amd64
“`

# 検証
`./main.go:16:18: &Duck{} does not escape` より、インターフェースはスタックに配置されていることがわかる。
つまり、検証対象の記事の主張は、現在のバージョンでは間違っているということである。

“`
package main

import “fmt”

type Sounder interface {
Sound()
}

type Duck struct{}

func (d *Duck) Sound() {
fmt.Println(

元記事を表示

[golang] グローバル変数は、Data segment というメモリ領域に配置される

# 目的
グローバル変数は、スタックでもヒープでもなく、Data segment というメモリ静的メモリ領域に配置されることを理解する。
下記の書籍に、ヒープにエスケープされると書いてあるが、これは間違いで、ヒープに配置されるわけではない。


> 変数がヒープにエスケープされる他の場合として、次のようなものがあります。
> – グローバル変数(複数のゴルーチンがアクセスできるので)

# 環境
“`
$ go version
go version go1.23.2 li

元記事を表示

[golang] サイズが未知の場合は、ヒープに配置されることを理解する。

# 目的
スライスが作成されるとき、容量が未知の場合は、ヒープに配置されることを理解する。

# 環境
“`
$ go version
go version go1.23.2 linux/amd64
“`

# 検証
## (1) スライスの容量が既知
スライスはヒープにエスケープされていない(スタックに配置されている)ことがわかる。
“` main.go
package main

func main() {
_ = make([]byte, 1, 2)
}

“`
“` main_test.go
package main

import “testing”

func Benchmark(b *testing.B) {
for i := 0; i < b.N; i++ { main() } } ``` ``` $ go build -gcflags "-m=2" . # gopractice ./main.go:3:6: can inline main with cost 5 as: func() { _ = make([]byte, 1, 2) } ./ma

元記事を表示

[golang] スコープ外で参照される可能性のある変数はヒープにエスケープされる

# 目的
スコープ外で参照される可能性のある変数はヒープにエスケープされ、ローカル変数として完結する変数はヒープにエスケープされないことを理解する。

# 注意
– 今回検証する値は、サイズを小さくしています。サイズが大きい場合、どんな状況でもヒープに配置されるので、今回の検証とは異なる結果になります。
– 今回はintスライスを返り値として扱っていますが、int では再現できません。
– intスライスが返り値の場合、intスライス構造体のコピーが返り、intスライス要素はヒープにエスケープされます。int スライス(構造体)は、内部にintスライス要素へのポインタを持っています。
– intが返り値の場合は、完全なコピーが返るので、ヒープにエスケープされる可能性はないです。詳しくは、下記の(4)の例を見てください。
– 返り値として、intではなくて`&int`(intのアドレス)を使った場合、intそのものがヒープにエスケープされる必要性があるので、intスライスと同じような検証結果になるでしょう。

# 環境
“`
$ go version
go v

元記事を表示

[golang] インライン展開により、`-gcflags` で`moved to heap` が出力されても、ヒープにエスケープしない場合もある

# 目的
インライン展開により、`-gcflags` で`moved to heap` が出力されても、ヒープにエスケープしない場合もあるということを理解する。

# 環境
“`
$ go version
go version go1.23.2 linux/amd64
“`

# 検証
## (1) ヒープにエスケープしないパターン
`moved to heap: res` が出力されているが、`f()`はインライン展開されるので、`res`はヒープにエスケープしない。
`moved to heap: res`の部分の出力は、あくまでも、その関数のスコープしか見ていないことに注意しよう。つまり、`f()`関数だけを見ており、呼び出し元でインライン展開されるかどうかは全く気にしていない。
ベンチマークテストにおける`0 allocs/op`という結果や、`` が出力されない結果を見れば、`res`がヒープにエスケープしてないことがわかるだろう。
後の(2)の例では、`0000000000466c00 `の出力があるが、今回は`f(

元記事を表示

【Go】任意の型を受け取るメソッド、interface{} とジェネリクスの活用

Goで構造体のメソッドを作成する際に、引数として任意の型を受け取れるようにする方法はいくつかあります。主に以下の2つの方法が考えられます。

1. **空のインターフェース `interface{}` を使用する方法**
2. **ジェネリクス(型パラメータ)を使用する方法(Go 1.18以降)**

それぞれの方法について詳しく説明します。

## 1. 空のインターフェース `interface{}` を使用する方法

Goでは、`interface{}` はすべての型を満たすため、任意の型の引数を受け取ることができます。ただし、`interface{}` を使用すると型安全性が失われるため、受け取った値を使用する際には型アサーションや型スイッチが必要になる場合があります。

### 例:

“`go
package main

import (
“fmt”
)

// 構造体の定義
type MyStruct struct{}

// メソッドの定義
func (m *MyStruct) PrintValue(value interface{}) {

元記事を表示

クリーンアーキテクチャとは?GoとEchoで実装する詳細ガイド

# はじめに

ソフトウェア開発において、**クリーンアーキテクチャ**は保守性、拡張性、テスト容易性を高めるための設計手法として広く認識されています。

本記事では、クリーンアーキテクチャの基本概念を深掘りし、Go言語とEchoフレームワークを使用して実装する方法を詳しく解説します。
コード例には豊富なコメントを付けて、各部分の役割を明確にします。

## クリーンアーキテクチャとは

クリーンアーキテクチャは、ロバート・C・マーチン(通称:アンクルボブ)によって提唱されたソフトウェア設計のパターンです。
主な目的は、**依存関係の方向性を明確にし、システムの各層が独立して開発・テスト・保守できるようにすること**です。
これにより、システム全体の柔軟性と拡張性が向上します。

## クリーンアーキテクチャの原則

クリーンアーキテクチャは、以下の5つの主要な原則に基づいています。

1. **依存関係の逆転(Dependency Rule)**
外側の層が内側の層に依存し、内側の層は外側の層について知りません。
具体的には、エンティティやユースケースはイン

元記事を表示

Go で Iota 識別子を使用して列挙 (enum) 的な実装をする

# Go には列挙型が存在しない

Java などに存在する列挙型ですが、Go にはそのような仕様がありません。
Go では列挙的な実装をしたいときに Iota 識別子が使用できるようです。
今回はシンプルなタスクのステータスを列挙する実装を例に Iota 識別子を使用する方法を考えます。

# Iota 識別子

Go には Iota (イオタと読むらしい) という識別子があります。

## 言語仕様

https://go.dev/ref/spec#Iota

> It can be used to construct a set of related constants

言語仕様にもこのように説明があるので、列挙的な実装をしたいときに使うことが想定されていると受け取れます。

# Iota 識別子を使用した列挙的な実装

どのような実装が可能なのか、いくつか試してみます。

## 定数に int 型の値を設定する

### 実装

“`main.go
package main

type TaskStatus int

const (
notStarted TaskStat

元記事を表示

Testcontainers使ってみた

## Testcontainersとは

https://testcontainers.com/

`Testcontainers`は、データベース、メッセージ・ブローカー、ウェブ・ブラウザなど、`Docker`コンテナで動作するあらゆるものの軽量インスタンスを提供するためのオープンソース・ライブラリです。

テストの依存関係をコードとして定義し、テストを実行するだけで、コンテナが作成され、削除されます。
モックや複雑な環境設定はもう必要ありません。

多くの言語とテストフレームワークをサポートしており、必要なのは`Docker`だけです。

## 背景

2023年12月、Docker社が`Testcontainers`の開発元であるAtomicJar社を買収したことが発表されました。
これにより、`Testcontainers`の開発はさらに活発になることが予想されます。
今まで、GoのDBのテストには`dockertest`を使っていましたが、この機会に`Testcontainers`を使ってみることにしました。

https://x.com/testcontainers/st

元記事を表示

What Is Go Programming Language and What Is It Used For?

![Go Programming Language and It’s uses.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3876978/b74fbc60-03b8-f252-d173-f599c90578b5.png)

Golang (Go programming language), is an innovative programming language designed by Google to simplify software development processes. Since its introduction, Go has grown immensely popular among developers due to its emphasis on simplicity, efficiency, and reliability. If you’re new to Go or curious to see what it can do for you or a project

元記事を表示

WebAssemblyを使った開発をやってみた

## はじめに
初めましての人もそうでない人もこんにちは!

最近は寒すぎてこたつを導入するか毛布で耐えるかめっちゃ悩んでいます!
皆さんは、まだ寒さに耐えられているでしょうか?風邪をひかないようにきをつけてくださいね!

今回はWebAssemblyを使って文字列を変換するアプリを作成してみました!
少し前にTwitter(現X)で「かれし」=「かれぴっぴ」なら「ししおどし」=「ぴっぴぴっぴおどぴっぴ」みたいなツイートを見て大爆笑したんですよね!
確かこの人だったはず・・・

https://x.com/hiyoooooorin/status/836461638416908288

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1485252234

少々お下品なので多くは語りませんがこれも似たような例ですね

そこで今回は例のように文字と文字を変換した文章を変換するアプリを作成しました!

あと今回は初めての挑戦としてWebAssemblyを使った開発もしてみたのでぜひ最後までご覧ください!

## WebAss

元記事を表示

jwtトークンについて調べてみた

## jwt(ジェット)とは

JWT(JSON Web Token)認証は、JSON形式のトークンを使用してユーザーの認証と情報の伝達を行う仕組み。セッション管理や認可に使用されている。jwtトークン自体に署名がついているので内容が改竄されていないかを検証できる。

## jwtのメリット

– サイズが小さいのでHTTPヘッダーに格納できる
– ペイロードにはユーザーに関する必要な情報がすべて含まれているので何度もDBに問い合わせなくても認証ができる
– Json形式なので、多くの言語でパースやマッピングがサポートされており、使いやすい

## jwtの構造

jetは以下の3つの要素で構成されている。

1. ヘッダー(Header)
1. ペイロード(Payload)
1. 署名(Signature)

上記3つの要素をそれぞれハッシュ化したものを`.`で連結したものがjwtトークンと呼ばれる文字列になる。

以下のサイトでイメージを確認できる。
https://jwt.io/

### ヘッダー

ヘッダーにはハッシュ化に使用するアルゴリズム情報やトークンのタイプなどの情報が

元記事を表示

【Go Echo】PostgreSQLにおけるマイグレーション管理

# はじめに

今回は、Goの強力なWebフレームワーク「Echo」を使用して、PostgreSQLをバックエンドとするAPIサーバーを構築し、`golang-migrate/migrate`を用いてデータベースのマイグレーションを管理する方法をご紹介します。

## 前提条件

以下のツールと環境がインストールされていることを確認してください。

– **Go**: [公式サイト](https://golang.org/doc/install)からインストール
– **PostgreSQL**: [公式サイト](https://www.postgresql.org/download/)からインストールし、データベースを作成済み
– **migrate CLI**: [インストール手順](https://github.com/golang-migrate/migrate/tree/master/cmd/migrate)に従ってインストール

## ステップ1: プロジェクトのセットアップ

まず、プロジェクトのディレクトリを作成し、必要なパッケージをインストールします。

`

元記事を表示

【個人開発】財務諸表データを速攻で確認できるアプリをリリースした

# 目次
– 財務諸表って見たことあります?
– 財務諸表検索アプリ「Compass」の技術スタック、構成の紹介
– 最後に

# 財務諸表って見たことあります?
 みなさん、企業の財務諸表を見たことはありますか?

 財務諸表とは企業の財務状況や経営成績をまとめた書類のことで、企業の1年間の「健康診断書」や「成績表」とも呼ばれています。

 財務諸表の中でも貸借対照表(B/S)、損益計算書(P/L)、キャッシュ・フロー計算書(C/F)は「財務三表」と呼ばれ、特に重要な書類とされています。

 …という説明をどこかで見たり聞いたりしたことはあるけれど、実際に財務諸表を見ようと思うと、企業のホームページに行って決算用のページに行って時には書類をダウンロードして…となかなか手間がかかります。

 そこで、財務諸表のデータを簡単に検索できるアプリ「Compass(コンパス)」を作りました!ユーザを企業の世界へと導いていく道しるべ(コンパス)になってほしいという願いと、企業(Company)へのパス(pass)になってほしいという願いを合わせて「Compass」と名付けました。

 

元記事を表示

【Go Echo】CSRF対策 + JWT認証

# はじめに

前回の記事では、[Golang EchoフレームワークでJWT認証を実装する方法
](https://qiita.com/syukan3/items/d8f0d900a0926604f090)について解説しました。

今回は、このアプリケーションに**CSRF(Cross-Site Request Forgery)対策**を追加し、セキュリティをさらに強化する方法を紹介します。

## CSRFとは?

**CSRF(クロスサイトリクエストフォージェリ)** は、ユーザーが意図しないリクエストを第三者が送信させる攻撃手法です。

これを防ぐために、**CSRFトークン** を用いてリクエストの正当性を検証します。

## 追加する機能の概要

1. **CSRFミドルウェアの設定**
2. **CSRFトークン取得用エンドポイントの追加**
3. **クライアント側でのトークン送信**

## 1. CSRFミドルウェアの設定

EchoにはCSRF対策用のミドルウェアが用意されています。`server.go`に以下の設定を追加します。

“`go
import (

元記事を表示

Golangの入門(最低限これくらいは知っておいた方がいい)

# 有益Udemy
全部は紹介しきれないので

https://www.udemy.com/course/golang-webgosql/?couponCode=24T4MT90924B

# 公式ドキュメント

https://pkg.go.dev/std

# Goのメリット
GoはRailsとかと比べたら軽量なので、企業で導入されることケース多いです。
Railsとかだとマイクロサービスの立ち上げがありますが、かなり容量やパフォーマンスなどがヘビーみたいです。
だからGoで作ろう、またはリプレースしようってなるみたいです。

またブロックチェーンの現場など最先端の現場で使われることが多いです。

# Goのデメリット
GoはRailsやLaravelみたいにコマンド1発でファイルができるとかではないです。
ライブラリ選定など1から組まなけれ䜀ならない䛾で、ボイラーテンプレートがあれば効率的に立

# 環境構築(Mac)
今回はMacで環境構築をやっていきます。

“`
brew install go
“`

– バージョン確認
“`
$ go version
go ver

元記事を表示

OTHERカテゴリの最新記事