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

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

[Golang]Googleログインを実装してみる

Golangのシンプルさと強力な機能を組み合わせて、Googleログインを実装する方法を学びます。このガイドでは、コード例と実践的なアドバイスを通じて、認証プロセスの設計と実装のコツを掴んでいきます。初心者でも理解しやすいように、基本的な原則から始めます。

## Googleログインの仕組み

Googleに限らず、多くのシングルサインオンは以下のようになっています。

1. GoogleアカウントにログインするページにコールバックするURLを踏めてリダイレクトする
2. ログインする
3. codeのクエリーパラメータとともにコールバック用のページに飛ぶ
4. codeをClientIDとClientSecretを使ってアクセストークンを取得する
5. Userテーブルを必要に応じて作成
6. JWTを作成して必要な情報含めてフロントに返す

今回はGoogleログインができることさえ確認が出来れば良いの4までを実装する

## 必要なライブラリをインストール

“`
go get golang.org/x/oauth2
go get golang.org/x/oauth2/g

元記事を表示

クリーンアーキテクチャについて考える DI編

## 目的

GolangのAPIのみのバックエンドプログラムを考えるときのクリーンアーキテクチャ実現のための依存性の注入をdigを使って実現する。

## 要約

クリーンアーキテクチャの実現において依存性の注入は必須になる。
Golangにおいて依存性の注入には有名な手法として[wire](https://github.com/google/wire)がある。
とても有名な手段であるのだが、現在更新が止まっている(最終が2021年)。
使っている状態であったとしてもこれだけ更新が止まってしまっていると継続利用に躊躇するレベルだと思っている。
今回は、[dig](https://github.com/uber-go/dig)を使って依存性の注入を行います。

## digのメリットとデメリット

digはDIコンテナを提供するモジュールとなっており、コンストラクタをコンテナに登録することで必要なインスタンスを提供します。
メリットとしては、引数などの情報なしにコンストラクタを登録するのみなので依存関係の解決が柔軟になっています。
デメリットとしては、暗黙的に依存関係を解決しようとする

元記事を表示

[Golang]Lambda+APIGatewayでミドルウェアを作るには?

ここ最近はあまりAPIGateway+LambdaのRestAPIを作ることはありませんでしたが昨年からGolangに仕事の言語が切り替わったこともあり、改めて作ってみることにしました。

そこで今回はミドルウェアを作ります。

ECSなどでやるのであればGinなどのWebフレームワークのミドルウェアを作れば良いのですが今回はそうはいかないので自分で作って見ます。

## なぜミドルウェアを作るのか?

Lamdbaに限らず、Webアプリではほぼ全てのAPIに使う共通的な処理があります。

例えばハンドラーのところの実行前に認証をしたり、入口と出口のロギングなどですね。

他の開発同様に共通処理の部分を作れるように2つのミドルウェアを用意します。

## 固定の共通処理の場合

速度測定のロギングなどやエラーハンドリング、認証で使うことが多いです。

“`golang
func middleware(next func(context.Context, events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, er

元記事を表示

爆速でGo言語の変数を説明する

# はじめに
皆さんGo言語書いてますか? 
私も最近Go言語を書き始めました。せっかく学習しているので、私が理解できたところは記事として残そうと思います。
今回はGoの変数についてです。

※作成者はこの記事を爆速(2時間くらい)で作ったため、誤字脱字があると思います。ご了承ください。

※この記事では変数の全てを説明していないので、詳しく知りたい方は[公式ドキュメント](https://go.dev/doc/)をご覧ください。

# そもそもGo言語とは??
Go言語は、Googleによって開発されたプログラミング言語で、シンプルで効率的な設計が特徴です。Goは、コンパイル速度が速く、メモリ使用量が少ないため、大規模かつ分散したシステム向けの開発に適しています。また、静的型付けとガベージコレクションを組み合わせ、安全で信頼性の高いコードを容易に記述できるようになっています。Goは、シンプルな文法や強力な標準ライブラリなど、開発者が生産性を高めるための機能を提供しています。

ってChatGPTが言ってます。
実際に書いてみて、コードをシンプルに書けると感じます。

# [本題] G

元記事を表示

Goのinterfaceをわかりやすく説明したい

## はじめに
何番煎じだという話ですが、Goのinterfaceついてどこよりもわかりやすく説明することを目標に記事を書きました。

## 要点
### 1. インターフェースは特定のメソッドを持っている構造体をグループ化する仕組み
### 2. インターフェース内にメソッドを定義すると、同じインターフェースに属する構造体全てがインターフェース内のメソッドを使用可能

## 実際にコードを見てみよう
下のコードを見てください。構造体GokuとKrikkinは両方ともメソッドのKamehamehaを使用できます。

“`
package main

import “fmt”

type Goku struct {
Power int
}

func (g Goku) Kamehameha() {
str := fmt.Sprintf(“%d Kamehameha”, g.Power)
fmt.Println(str)
return
}

type Krillin struct {
Power int
}

func (k Krillin) Ka

元記事を表示

JSON Web Tokens で GridDB REST API を保護する

これまでの記事で、GridDBと[Java][1]、[Node.js][2]、[Go][3]といった様々な技術を使ってREST APIを作る方法を取り上げてきました。また、以前簡単には触れることはありましたが、Webベースの認証でデータやエンドポイントを保護する方法について具体的な詳細には触れてきませんでした。

今回から2回に分けて、JSON Web Tokensとは何か、どのように実装するのか、GridDBのREST APIを保護するためにどのように利用するのかについて解説します。後編では、JSON Web Tokens を利用することで得られる詳細な情報を紹介します。記事が公開されたら、ぜひご覧ください。

この記事で紹介されている内容を実行するには、あなたのマシンにGoとGridDBとGridDB Go Connectorをインストールする必要があります。この記事のコードは、HTMLのテンプレートファイルを除き、すべてGoで記述します。

## 前提条件

上記で説明したように、以下のものが必要です。

* [GridDB サーバ (v5.3)][4]
* [Go v1

元記事を表示

Goで学ぶGraphQLサーバーサイド(12)ーGraphQLサーバーから返却されるエラーメッセージ

こんにちは。

今回は「GraphQLサーバーから返却されるエラーメッセージ」について説明していきます。

# この章について

GraphQLサーバーからは、いつもリクエストに応じたデータが得られるとは限りません。
サーバー内でエラーが発生した場合や、そもそもリクエストが不正なものだった場合には、エラーメッセージという形でそれがクライアントに提示されます。
この章では、GraphQLがユーザーに返すエラーデータについて深く掘り下げていきたいと思います。

# GraphQLが返すエラー
## エラーが持つフィールド

GraphQLクライアントがサーバーから受け取るエラーの形式は、`github.com/vektah/gqlparser/v2/gqlerror`パッケージ内の`Error`構造体として定義されています。

“`graphql
type Error struct {
Message string `json:”message”`
Path ast.Path `json:”path,omi

元記事を表示

Go で Kong Gateway カスタムプラグインを作成する

## この記事の目的

以下の記事で Kong Gateway の公式ドキュメントを読んで動作確認を行いました.

https://qiita.com/caunu-s/items/636aff1d04778fbbd779

こちらの記事では Kong Gateway のドキュメントから特にカスタムプラグイン作成について確認と検証をしてみます.

:::note info
こちらの記事を参考にして Kong Gateway (OSS) および Kong Gateway (Free) 用のカスタムプラグインを Go 言語を使って作成することができます.
:::

:::note warn
こちらの記事の動作確認は上記の記事による Kong Gateway 環境構築を前提としています.
:::

## 動作確認環境

動作確認を行った環境情報を以下に示します.

| Name | Version |
|—-|—-|
| Windows 10 | 22H2 |
| Ubuntu (WSL2) | 20.04 LTS |
| Docker | 20.10.17 |
| Docker Co

元記事を表示

go install時にis not in stdエラー

単純なミスに気が付かずにハマったので備忘録。
検証のためにGoのインストールやアンインストールを繰り返していたら下記エラーが出るようになった。

“`zsh
$ go install golang.org/dl/go1.21.0@latest
../../go/pkg/mod/golang.org/dl@v0.0.0-20231219203010-00f4782d5d4c/internal/version/version.go:9:2: package archive/tar is not in std (/opt/homebrew/Cellar/go/1.21.5/src/archive/tar)
../../go/pkg/mod/golang.org/dl@v0.0.0-20231219203010-00f4782d5d4c/internal/version/version.go:10:2: package archive/zip is not in std (/opt/homebrew/Cellar/go/1.21.5/src/archive/zip)
../../go/pkg

元記事を表示

terminalでChatGPTを使いたい

# GoでChatGPT
terminalから呼び出せるGPTクライアントをgolangで作成します。

## main関数
“`go:main.go
package main

import (
“bufio”
“fmt”
“os”

“./gpt”
)

func main() {
for {
fmt.Print(“> “)
scanner := bufio.NewScanner(os.Stdin)
if scanner.Scan() {
input := scanner.Text()
if input == “exit” {
fmt.Println(“exit!”)
break
}
gpt.Call(input)
}
}
}
“`

exitと入力したら終了します。

“`go:gpt/call.go
package gpt

import (
“bytes”
“encoding/json”
“fmt”
“io”
“log”
“net/http”
“os”

“github.com/joh

元記事を表示

Go 1.21以降での、go.modを利用したバージョン固定可否の検証

今はプロジェクトでバージョンの固定にgoenvを利用しているが、

「Go 1.21以降では、go.modに記載されたgoのバージョンがインストールされていない場合、自動でダウンロードして指定のバージョンのgoで実行されるためGoenvが不要になる。」

という話を聞いたので、Go公式が用意したツールチェインを利用した方法で、
マイナーバージョンも含めてGoのバージョンをプロジェクトごとに固定出来るか、検証した。

## 検証

### 事前準備

#### go1.21.1のインストール

“`zsh
$ go install golang.org/dl/go1.21.1@latest
$ go1.21.1 download
“`

“`zsh
$ go1.21.1 version
$ go1.21.1 env GOROOT
/Users/mitsuaki.ihara/sdk/go1.21.1
$ go version go1.21.1 darwin/arm64
“`

#### go.modの作成及び検証用ファイル作成

Goのプロジェクトを初期化する。

“`zsh
$

元記事を表示

Go入門したい人におすすめの学習方法6選

## はじめに
こんにちは、もみです!

大学で情報工学を学びながら、Web系エンジニアを目指している学部2年生です。
Go言語の学習を半年前に始め、学生であることの時間的利点を生かして、複数のGo言語学習リソースを学んできました。

昨今、Go言語はそのシンプルさや大規模開発への適合性などさまざまな魅力から人気を集めています。
企業でも採用されることが増えており、Go言語を学び始める人も増えています。

今回の記事では、これからGo言語に入門する人へ、私が実際に試してとくに良かった学習リソースを紹介します。

## 対象読者
– Goに入門したい人
– プログラミング初心者〜中級者
– 自分にあった学習リソースを探している人

## プログラミング未経験者向け

[Progate Go](https://prog-8.com/courses/go)
– プログラミング未経験者でもつまずきにくい
– 環境構築が不要
– コードの自動採点がある
– イラストや図などを用いたわかりやすいスライド解説
– 基本的な内容、簡単な内容のみで構成されており、はじめの一歩に

元記事を表示

IPアドレスを隠蔽したいので、GolangでHTTPプロキシサーバーを作る

# Goでプロキシサーバー
プロキシサーバーをGolangで作成してみます。

# プロキシサーバー
ポート8080で作成します。リクエスト先のURLを取得し、代理でプロキシサーバーがリクエストを送信、レスポンスを複製して返しています。

“`golang:main.go
package main

import (
“fmt”
“io”
“log”
“net/http”

“github.com/labstack/echo/v4”
“github.com/labstack/echo/v4/middleware”
)

func handler(c echo.Context) error {
url := c.Request().URL.String()
req, _ := http.NewRequest(c.Request().Method, url, c.Request().Body)

for name, values := range c.Request().Header {
for _, value := range values {
req.H

元記事を表示

Go API(Gin)をCloud Functionsにデプロイする方法(CLI, Terraform)

## はじめに
Glolang WebアプリケーションGinを用いたサーバーレスアプリケーションをgcloud CLI, Terraformそれぞれを用いてCloud Functionsにデプロイします

今回用いたコードは[GitHub](https://github.com/tomoish/gin-Cloud-Functions)で公開しています。

## 環境
Golang: 1.20.4
Terraform v1.6.6

## ディレクトリ構成
“`
.
├── gin
│ ├── cmd
│ │ └── main.go
│ ├── function-source.zip
│ ├── gin_http.go
│ ├── go.mod
│ └── go.sum
└── infra
├── main.tf
└── terraform.tfvars
“`

## Gin
### Gin Tutorial
今回は[Gin Tutorial](https://go.dev/doc/tutorial/web-service-gin)で作

元記事を表示

Salesforce Pub/Sub API を利用してみる

※ これから記載する事項は、私が所属する会社とは一切関係のない事柄です。

今回は [Pub/Sub API](https://developer.salesforce.com/docs/platform/pub-sub-api/overview) の[サンプル](https://github.com/developerforce/pub-sub-api/tree/main/go/examples)を実行する方法を紹介したいと思います。

## Pub/Sub API では何ができるの?

Pub/Sub API は gRPC と HTTP/2 に基づいた API で、リアルタイムでイベントを介してデータのやり取りを行うことができます。公開されたイベントはイベントバスに 72 時間保存されるので、一時的に切断されていたとしても過去のイベントを再取得することができます。

ユースケースとしては外部システムとのデータの同期やオブジェクト変更時の通知といったようなことが挙げられます。

Trailhead の「[Pub/Sub API を使用する](https://trailhead.sal

元記事を表示

OpenTelemetry 調査

# OpenTelemetryについて

## 目次
1. [概要](#概要)
2. [機能/詳細](#機能詳細)
3. [なぜ必要か](#なぜ必要か)
4. [サンプルコード](#サンプルコード)
5. [まとめ](#まとめ)

## 概要
OpenTelemetryは分散トレーシングとメトリクスの観測性データを収集し、分析・監視・トラブルシューティングを行うためのオープンソースのツールキットです。分散システムのコンテキストをキャプチャし、リクエストの経路やパフォーマンスの問題を追跡するための一貫した手法を提供します。

## 機能/詳細
OpenTelemetryには以下の主な機能があります:

### トレーシング
分散トレーシングを使用して、リクエストの経路やリクエスト間のタイミング情報を収集します。これにより、アプリケーションのコンポーネント間の相互作用の可視化とトラブルシューティングが容易になります。

### メトリクス
アプリケーションのパフォーマンスやリソース利用率を測定し、カスタムメトリクスを作

元記事を表示

【GoとPython】異なる言語、共通する哲学

:::note info
この記事はAndrew Gerrand氏のGo and the Zen of Python[^1]を訳したものです。
:::
[^1]:https://go.dev/talks/2012/zen.slide#1

## “Beautiful is better than ugly.”

Goは、C言語を彷彿とさせる軽量で規則的な構文を持っている
しかし、美しいか醜いかは、個人に依存する

## “Simple is better than complex.”

メソッドはただの関数であり、特別な場所は無い
thisやselfなどのキーワードはなく、レシーバは他の関数引数と同じようなものである

“`go
type Vector struct {
X, Y float64
}

func (v Vector) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
“`

## “Simple is better than complex.”

メソッドはクラスがなくても任意の名前付き型で宣

元記事を表示

プログラミングについて管理者がとりあえず知っておきたい内容 Go言語編

# 業務で利用しないのに何日もかけて勉強するのはちょっとしんどい!

「1日」ならできる!

# たった1日で基本が身に付く!Go言語  清水 美樹[著]

以下は本のホント触りの部分。詳しくは本を参照ください!

・Google社が開発したプログラミング言語。
・「構造体」「ポインタ」等、C言語を感じさせるが、C言語より簡単
・コンパイラを用いてOS上で直接動く実行プログラムを作成する。

|言語|説明|
|—-|—-|
|C/C++|WEBアプリから周辺機器のドライバまで幅広い用途。コンパイラ必要。|
|Java|オブジェクト指向言語。C言語の書き方に近い部分あり。ライブラリや開発ツール豊富。実行環境をインストールした上でコンパイラで中間言語に変換する。|
|C#|Microsoftの.NETフレームワークを実行環境とするオブジェクト指向言語。コンパイラ必要。Microsoft Visual Studioが主要な開発ツール。|
|Python|最近ではAIと共に再注目されている。|
|JacaScript|HTML5との組み合わせでWEBページの記述で使用される言

元記事を表示

Go 1.21.0からruntime/coverage.WriteCountersDirで-covermode=atomicエラー

GoのバージョンをGo 1.21.0に上げた所、
scenarigoを利用して起動しているE2Eテストにて、
カバレッジを出力するAPIにて、下記エラーが出るようになった。

“`go
func (h *Handler) Record(gc *gin.Context) {
err := coverage.WriteCountersDir(“./_coverage”)
if err != nil {
panic(err)
}
}
“`

“`zsh
2023/12/18 18:36:24 http: panic serving 127.0.0.1:52164: WriteCountersDir invoked for program built with -covermode=set (please use -covermode=atomic)
goroutine 3046 [running]:
net/http.(*conn).serve.func1()
“`

## 原因

Go 1.21.0から、atomic mode必須に変更されている。

### Go 1.2

元記事を表示

Echo(Go)のMiddlewareを理解する (Recover,CORS)

# はじめに
こんにちは。TuneCoreJapanでバックエンドエンジニアをしています @masafumi330 です。
この記事は[Wano Group Advent Calendar2023](https://qiita.com/advent-calendar/2023/wano-group) 最終日の記事です。もう一度言いますよ。最終日の記事です!

今回は、弊社バックエンドアプリケーションの開発でも使用しているGo、 そのフレームワーク**Echo**について、その**Middleware**の機能にフォーカスを絞り、
– Middlewareとは何なのか?
– Middlewareによってどのような課題を解決できるのか?
– 実際にどのようにMiddlewareの機能を使うのか?
をまとめていきたいと思います。

https://echo.labstack.com/

# 調査の経緯
まずは今回、EchoのMiddleware機能を調査してみるにあたった経緯を話そうと思います。

Wanoに入社して2年間、私はバックエンドチームにてGoを用いたアプリケーション開発を行ってき

元記事を表示

OTHERカテゴリの最新記事