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

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

ゼロからわかるセッションベース認証の基本

アプリケーションにおけるユーザー認証は、セキュリティとユーザーエクスペリエンスの核となる部分です。
この記事では、セッションベース認証(この記事ではセッション認証とします)の基本を理解し、Go言語(Golang)のを使った具体的な実装方法を解説します。標準ライブラリのみ使用してシンプルに書いてあるのでGo言語を普段使わない人も理解しやすいかと思います。

# セッション認証とは?
セッション認証は、ユーザーが一度ログインすると、その後の各リクエストでユーザーを識別する方法です。
通常、セッション認証では以下のステップが含まれます。

1. ユーザーはブラウザを通じてIDとパスワードを含むログインリクエストをサーバーに送信します。
2. サーバーは提供された認証情報を検証し、正しいと判断された場合にセッションを確立します。セッション情報はサーバー内とCookieに保存されます。今回はメモリに保存しますが、実際のアプリケーションではDBやその他のストレージを使用することが一般的です。
3. サーバーは、セッションが確立されたことを示すレスポンスをブラウザに送り返します。
4. ユーザーが認

元記事を表示

GoのLambda関数のランタイムをGo1.xからprovided.al2に変更しました(Serverless Framework)

# はじめに

AWSサービスから以下のようなメッセージが来たので、Lambda のランタイムを`GO 1.x`から `provided.al2`に変更しました。
Web検索で調べたところ、SAMの記事に対して`ServerlessFramerwork(SLS)`の記事が少ないように感じたので、
その時の苦戦したところやわかりにくかったポイントをまとめておこうと思います。

“`
お客様の AWS アカウントに現在 Go 1.x ランタイムを使用する 1 つ以上の Lambda 関数があることを確認しましたので、ご連絡いたします。

Amazon Linux AMI のメンテナンスサポートが 2023 年 12 月 31 日に終了するのに合わせて、AWS Lambda での Go 1.x ランタイムのサポートを終了します [1]。Lambda は、provided.al2 ランタイムを使用して Go プログラミング言語を引き続きサポートします。provided.al2 ランタイムを使用すると、AWS Graviton2 プロセッサのサポートや、より小さなデプロイパッケージとより高速な

元記事を表示

[Go]「…(ピリオド3つ)」の使い方(応用編)

# はじめに
以下の記事の応用編を書いてみました。

https://qiita.com/Yashy/items/a02b74a00136dc5a42c4

# 「…」の使い方(応用編)
## インターフェース型での可変長引数
Goの可変長引数は、インターフェース型を利用することで、異なる型の引数を一つの関数で受け取ることができます。これは特に、ログ出力や汎用的な処理を行う関数を作成する際に便利です。

“`go
func WriteMultipleTypes(values …interface{}) {
for _, value := range values {
fmt.Println(value)
}
}

func main() {
WriteMultipleTypes(1, “two”, 3.0)
}

// 実行結果
1
two
3
“`
## 外部からオプションを設定する
外部からオプションを設定する一般的な例として、設定オブジェクトや構造体を初期化する関数を考えてみましょう。このアプローチは、設定が多く、柔軟性が必要な場合に特に有用です。
“`g

元記事を表示

[Go]不確実性なテストで使える assert.InDelta と assert.InEpsilon の使い方

# はじめに
Hello wolrd!
今日は testify パッケージの中でも特に便利な `assert.InDelta` と `assert.InEpsilon` の使い方について解説します。
これらの関数は、数値の比較テストを行う際に非常に役立ちます。特に、浮動小数点数の精度問題や、小さな誤差を許容する必要があるテストケースに適しています。

## assert.InDelta の基本
assert.InDelta は、2つの数値間の差が特定の絶対値(デルタ)以内であることを検証するために使用されます。これは、特に浮動小数点数の計算結果が完全に一致しない場合に便利です。以下の例を見てみましょう。

“`go
func TestInDelta(t *testing.T) {
tests := []struct {
name string
expected interface{}
actual interface{}
delta float64 // 許容可能な差分の範囲
}{
{
name: “許容範囲が0、実際の差が0”

元記事を表示

VSCode gopls client: couldn’t create connection to server.の解決法

表題にあるエラーでめちゃくちゃハマったので、解決策を残します。

“`bash
[Error – 10:13:34 PM] gopls client: couldn’t create connection to server.
Message: Pending response rejected since connection got disposed
Code: -32097
[Error – 10:13:35 PM] The gopls server failed to initialize.
[Error – 10:13:35 PM] gopls client: couldn’t create connection to server.
Message: Pending response rejected since connection got disposed
Code: -32097
Error starting language server: Error: Pending response rejected since connection go

元記事を表示

Goで学ぶGraphQLサーバーサイド(7)ーリゾルバの実装(応用編)2

こんにちは。

Part 7も「リゾルバの実装 – 応用編」についてです。
今回はリゾルバ分割の実装と動作確認について説明いたします。

#リゾルバ分割の実装

リゾルバを分割していない今の状況ではどのような不具合があるのかを確認できたところで、いよいよ分割実装をしていきましょう。

## `gqlgen.yml`に分割設定を記述

リゾルバを分割する設定は、`gqlgen.yml`に記述します。

“`gqlgen.yml
models:
+ Repository:
+ fields:
+ owner:
+ resolver: true
+ issue:
+ resolver: true
+ issues:
+ resolver: true
+ pullRequest:
+ resolver: true
+ pullRequests:
+ resolver: true
“`

今回の分割の方針は「`repository`クエリを実行して得られた`Repo

元記事を表示

ゴールーチンのメモ(チャネルなど)

## Goroutineとは
Goroutineとは、goのステートメントで、関数を指定することによって並行実行されるもの。

“`go
package main

import (
“fmt”
“time”
)

func main() {
go goroutine(“Hello!”)
hoge(“World!”)
}

func goroutine(s string) {
for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s) } } func hoge(s string) { for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s) } } > World!
> Hello!
> Hello!
> World!
> World!
> Hello!
> Hello!
> World!
> Hello!
> World!
→ 並行で実行したため、表示される順番がバ

元記事を表示

【永久保存版】0からGo言語を勉強するならこのロードマップに従え!

![bandicam 2023-11-14 18-39-01-453.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/0372d1bc-04dc-e94f-e5ff-4a3f721667dd.jpeg)

# はじめに

こんにちは!!@Sicut_studyです!

今回は**Go言語**の個人的に良かったと思った学習方法を**Go言語を学ぶための最速ロードマップ**として記事にまとめていきます!

つい先日**技術書典**があり、改めて**Go言語**が注目されているというのを再実感しましたので記事を書くなら**今だ!!**と思いました

過去にも**0からロードマップシリーズ**は書いていますので参考にしてみてください

https://qiita.com/Sicut_study/items/78910cd8d103b8d45a73

https://qiita.com

元記事を表示

OPA・Regoでコーディング規約が守られている事を検査する

## 概要

チームやプロジェクトで独自に定めたコーディング規約が遵守されていることを確認するために、OPA・Regoを使ってコードを検査する。Golangでの実装を想定している。

## 仕組み

まず、検査対象のコードをASTに変換する。ASTは、抽象構文木のことで、コードの構造を表現したデータ構造のこと。ASTを使うことで、コードの構造をプログラムで扱えるようになる。
Regoで記述したコーディング規約をポリシーとして、ASTをインプットとしてOPAに渡すことで、コーディング規約に違反している箇所を検出することができる。

## goast

上記を簡単に実現するために、[goast](https://github.com/m-mizutani/goast)というツールを使用する。goastはユーザが定義したポリシーをもとに上記をまとめて行ってくれる。出力した結果に`pos`という名前でPos値を渡すことで、出力に違反しているコードを表示することもできる。

“`rego
res := {
“msg”: “fmt.Println is not allowed”,

元記事を表示

GolangとCasbinでABACを実装する

# はじめに
認可専用のライブラリである[Casbin](https://casbin.org/)を使って、[ABAC](https://en.wikipedia.org/wiki/Attribute-based_access_control)を実装してみる。Casbinでは、単純にルールを羅列するのではなく、[eval()という組み込み関数](https://casbin.org/ja/docs/abac#scaling-the-model-for-complex-and-large-numbers-of-abac-rules)を使用することで、任意の認可ロジックを簡潔に組み込むことができる。なお、CasbinそのものやRBAC/ABAC等の認可の概念に関する説明は本記事ではしない。

eval()では、[公式ドキュメントの例](https://casbin.org/ja/docs/abac/#scaling-the-model-for-complex-and-large-numbers-of-abac-rules)のように直接ロジックを渡すこともできるし、[`AddFunction

元記事を表示

Go:入門者向けにポインタをコードで解説

# はじめに
Go言語のポインタの概念が分かりづらく、理解に時間を要しました。
初心者は、**文章よりもコードを書いて動かしてみる方が理解が深まると思うので**、本記事のコードを参考にしてください!

# ポインタとは
ポインタは、ある値が格納されているメモリアドレスを保持する変数です。
ポインタを使用すると、直接そのメモリアドレスにアクセスして値を読み書きすることができます。
以下の演算子を使用して、ポインタを宣言します。

– &演算子:変数のメモリアドレスを取得します。
– *演算子:ポインタが指すメモリアドレスの値にアクセスします。

# 例:ポインタを使って値を変更する

“`go
package main

import “fmt”

func main() {
number := 10 // 整数変数の定義
fmt.Println(“元の値:”, number) // 元の値の出力
fmt.Println(“numberのアドレス:”, &number)

元記事を表示

Go言語 レシーバ

## レシーバとは
Go言語における「レシーバ (Receiver)」は、他の言語でよく見られる「this」や「self」といったキーワードに相当する。Goのメソッド内でレシーバを介して構造体のメンバー変数やメソッドにアクセスすることができる。

例えばjavaの場合、クラスのメソッド内でクラスのメンバー変数にアクセスするためには this キーワードを使用します。Goにおけるメソッドではレシーバがその役割を果たし、構造体のフィールドやメソッドにアクセスするために利用される。

## java / Go での比較

“`java:java
public class MyClass {
private int value;

public void setValue(int newValue) {
this.value = newValue; // “this”を使ってメンバー変数にアクセス
}
}

“`

“`go:go
package main

import “fmt”

type MyClass struct {
valu

元記事を表示

Goで学ぶGraphQLサーバーサイド(6)ーリゾルバの実装(応用編)1

こんにちは。

Part 6は「リゾルバの実装 – 応用編」についてです。

# この章について

「リゾルバの実装 – 基本編」にて実装を行った際には、GraphQLのスキーマで定義されたクエリ・ミューテーション1つに対してリゾルバメソッド1つが紐づいている状態でした。

– `user`クエリ: `*queryResolver型`の`User`メソッドを実行
– `repository`クエリ: `*queryResolver`型の`Repository`メソッドを実行
– `node`クエリ: `*queryResolver`型のNodeメソッドを実行
– `addProjectV2ItemById`ミューテーション: `*mutationResolver`型のAddProjectV2ItemByIDsメソッドを実行

この章ではリゾルバを分割することによって、この1:1対応を解消していきます。

# リゾルバを分割する前の状況確認

まずは、リゾルバ分割を行っていない状況ではどのような挙動をしているのか、もう一度確認してみましょう。
応用編では、`repository`クエリ

元記事を表示

Go:map型の変数にキーが存在するかどうかを判定

# はじめに
map型の変数にキーが存在するかどうかを判定するためのコードを作りました。
理解するのに役立つと思うので、「1. 判定処理、2. 実行結果」の部分を見てみてください。
それに続いて、「3. IF文を使った判定処理、4. 実行結果」のセクションでは、少し複雑なコードを紹介しています。

# 1. 判定処理
“`go
package main

import (
“fmt”
)

func main() {
seen := make(map[int]string)

// キー1に対して値を設定
seen[1] = “存在する1”

// キー2に対して値を設定
seen[2] = “存在する2”

// キー3は設定しない

// キー1の確認
value, exists := seen[1]
fmt.Println(“Key 1: Value =”, value, “/ Exists =”, exists)

// キー2の確認
value, exists = seen[2]
fmt.Println(“Key 2: Value =”, valu

元記事を表示

【メモ】Goの環境設定

MacOSの場合

1. Goのダウンロードページにアクセス https://go.dev/dl/
2. 自分のPCのOSに応じ、選んでダウンロード
3. インストール
4. ターミナルで`ls /usr/local/go/bin`で`go`が表示されるかを確認
5. 右記を実行 `echo ‘export PATH=$PATH:/usr/local/go/bin’ >> ~/.zshrc`
6. 右記を実行 `source ~/.zshrc`で変更内容を適用
7. `go version`でバージョンが表示されたら成功

元記事を表示

Goで作るクリーンアーキテクチャの自己解釈まとめ

# 本記事の内容
Go言語によるWebアプリの個人開発に挑戦中の非Web系エンジニアが、個人の勉強の過程で情報を整理するための自分向けページ。
調べる中で出てきた別ページの情報を1か所にまとめるために使用。
この記事を見て読者であるあなたが何か学べる、という内容ではありません、、、

## クリーンアーキテクチャの目的
# 設計思想
– 依存性逆転の原則(Dependency Inversion Principle): 高レベルのモジュールは低レベルのモジュールに依存すべきではなく、どちらも抽象に依存すべき。抽象は詳細に依存してはならない。
– 単一責任の原則(Single Responsibility Principle): 一つのクラスはただ一つの責務を持つべきであり、変更の理由は一つであるべき。

## メリット/デメリット
– 🙂 保守性向上: フレームワーク非依存で変更が容易。バグが発生しにくい構造を提供
– 🙂 テストが容易性: 機能を分割しドメインを区切ることでテスト、統合テストがしやすい
– 🙂 拡張性: 別のドメインとの間にインター

元記事を表示

アプリ開発でGo言語を採用するメリット

# はじめに
Go言語は2007年にGoogleが開発した比較的新しいプログラミング言語です。
近年、日本の各企業でGo言語を使用してクラウドサービスを開発しています。
今回はクラウドサービスを開発する上でGo言語を採用するメリットをまとめました

# 一覧
+ パフォーマンスと効率性
+ 並行処理
+ 簡潔性と可読性
+ ライブラリ
+ クロスプラットフォームとコンテナ対応
+ 静的型付けと安全性
+ ミニマリズム
+ クラウドネイティブエコシステムとの相性

# 1.パフォーマンスと効率性
コンパイル言語であるGoは、インタプリタ言語のPythonやRubyに比べて高速に実行されます。これは、特にリアルタイムでのデータ処理や大量のトランザクションを扱うクラウドアプリケーションにおいて重要です。
“`go
package main

import (
“net/http”
“fmt”
)

func main() {
http.HandleFunc(“/”, func(w http.ResponseWriter, r *http.Request) {

元記事を表示

reviveでカスタムLintルールを設定する方法

### **はじめに**

Go言語のプロジェクトにおいて、コードの一貫性と品質を保つことは非常に重要です。標準のlintツールは多くの基本的なニーズを満たしますが、特定の命名規則やスタイルガイドに完全に準拠するためには、追加の設定やツールが必要になることがあります。この記事では、特に**`revive`**を使用してGoのコードに対するより厳格なlintチェックを行う方法について解説します。

### `revive`の導入

`revive`は`golint`の代替として推奨される、柔軟で高速なlintツールです。これは、Goのコードに対するスタイルと品質のチェックを提供し、カスタマイズ可能なルールと高速な実行が特徴です。

### `revive`の設定例

`revive`をプロジェクトに組み込む基本的な手順と、特定の命名規則をチェックするための設定例を以下に示します。

まず、`revive`を有効にするために、lint設定ファイル(例えば`.golangci.yml`)に以下のように追加します。

“`yaml
linters:
enable:
– reviv

元記事を表示

技術書典って何だ?面白そう!出展しよう!ってなった話

## はじめに
この記事は技術書典の存在を知ってから出展するまでの奮闘記になります。
企画〜出展までの体験やその時に迷ったことなどつらつら書いていきます!
まだやったことないけど、技術書典今後挑戦したい!という方の参考になれば嬉しいです!

## きっかけ
ある日の会社でのできごと。リーダーがなにやら面白そうな技術書をもってコンビニに行っておりました。曰く「過去に技術書典にて出展した本の余りが売れたので配送しにいく」とのこと。
色々話を聞いていくと、どうやら仲間と技術書を作って販売イベントがあるらしいということが分かりました。
「仲間と本を書いて、それを人に読んでもらう体験って素晴らしい!」と思い次の日には仲間数人を誘って技術書典15への出展を決意しました。
そこから専用のslackチャンネルとNotionを立ち上げて、やる気マックスで活動を開始!

## 企画
`(時期:2023年5月 ~ 2023年6月)`
やるとなったら決めなければいけないことがたくさんあります。
– チーム名
– タイトルや執筆内容
– スケジュール感

などなど。。
運営やスケジュール周りのことは僕が土台作っ

元記事を表示

distrolessの利用には依存関係に気をつけよう

“`
FROM amd64/golang:1.18 AS builder

ENV PROJECT xxx/xxxx/batch
WORKDIR /go/src/$PROJECT

# restore dependencies
COPY go.* ./
RUN go mod download

COPY . .
RUN go build -o /batch

FROM gcr.io/distroless/static AS release
WORKDIR /
COPY –from=builder /batch /batch
USER nonroot:nonroot
ENTRYPOINT [“/batch”]
“`
というようなDockerのマルチステージビルドをして、生成物も出力されているのに、ENTRYPOINTを実行すると
terminated: Application failed to start: “/batch”: no such file or directory
ファイルは確かにそこにあるのに、ファイルが見つからないという不思議なエラーになりました。
原因は、RU

元記事を表示

OTHERカテゴリの最新記事