Go関連のことを調べてみた2023年08月24日

Go関連のことを調べてみた2023年08月24日

Go 1.21で注目したい機能

https://go.dev/blog/go1.21

Goの1.21がリリースされましたね!
なんといっても今回特筆すべきはslicesパッケージの登場だと思います
多言語を扱うエンジニアさんはGoのスライスに扱いづらさを感じた方も多いんじゃないでしょうか
他の言語と遜色ない機能が追加、かつ直感的な関数名のものが増えたので自分が嬉しいなと思った物を紹介したいです

# slicesパッケージ

## [Contains](https://pkg.go.dev/slices#Contains)
sのスライス内にvが存在するかをチェックし、存在すればtrueが返ります

“`golang
func Contains[S ~[]E, E comparable](s S, v E) bool
“`

[サンプル](https://go.dev/play/p/_F9v_sScpD_I)

“`golang
m := []string{“taro”, “jiro”, “saburo”}
ok := slices.Contains(m, “jiro”)
fmt.Println(fmt.Sp

元記事を表示

Docker + Goで始めるREST API開発 開発環境編

## 目次
1. 構成
2. フォルダ構成
3. dockerfileとyamlファイル
4. goの実装
5. 動作検証

## 1.構成
|ミドルウェア|バージョン|
|—-|—-|
|golang|13.4.16|
|docker|18.16.1|

## 2.フォルダ構成
“`
┣━backend/
┃  ┣━build
┃  ┃ ┣━Dockerfile
┃  ┃ ┗━.go_env
┃  ┗━cmd
┃    ┗━main.go
┗━docker-compose.yml
“`

## 3. dockerfileとyamlファイルの作成
#### まずはDockerfileの作成を行います。
Dockerfileは、Dockerイメージを作成するための手順書となります。
そのため、goのどのバージョンを利用するのか?や、どのフォルダで作業を行うのか?ここには記載していませんが、今後出てくる、ミドルウェアのインストールについても、このDockerfileに記載します。
“`Dockerfile
# goバージョン
FROM golang:1.21.0

元記事を表示

gopls was not able to find modules in your workspace. への対処

## VSCodeにおけるGoのモジュール周りのエラー

参考書の写経やハンズオンイベントでのコード管理で、たまに出会います。

![image-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366105/c936bc7d-ff34-211e-9a94-8c2f39d82517.png)

“`
gopls was not able to find modules in your workspace.
When outside of GOPATH, gopls needs to know which modules you are working on.
You can fix this by opening your workspace to a folder inside a Go module, or
by using a go.work file to specify multiple modules.
See the documentation for more information

元記事を表示

JWT認証を作成中にecho.Context.Get()の引数でぬまった話(Golang + Echo)

## 目次
– [x] [今回の記事の経緯](#今回の記事の経緯)
– [x] [ぬまった箇所](#ぬまった箇所)
– [x] [解決策](#解決策)
– [x] [参考文献](#参考文献)

## 今回の記事の経緯
今回はバックエンド側のGolangを用いたJWT認証のロジックを考えているときにぬまったお話をいたします。

The Clean Architectureに基づいてロジックを下記のように実装していました。

“`history_controller.go
package controller

import (
“backend/model”
“backend/usecase”
“net/http”
“strconv”

“github.com/golang-jwt/jwt/v4”
“github.com/labstack/echo/v4”
)

type IHistoryController interface {
GetAllHistory(c echo.Context) error
// 以下省略
}

type historyControl

元記事を表示

ナイーブな再帰フィボナッチでマイクロベンチマーク

# これは何?

もともと
https://qiita.com/fsdg-adachi_h/items/5feeda2ed19f879fdf9a
という URL で公開されていた記事に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6854/fd51abff-28a5-b664-b4a3-9b6773e7adf3.png)

というコメントを書いたら、その記事は削除されて。
同じ方が、全く同じような内容で

https://qiita.com/fsdg-adachi_h/items/c54135cf0a562019295c

という記事を公開されて。
なぜか私はコメントできない(ブロックされてるのかな)ようなので、コメントで書きたかった追加情報に関する記事を書こうと思った。

## int の長さの影響なのかどうか

元のコードが go は `int`。環境から類推するに 64bit 整数。
C / C++ は、おそらく 32bit。Java の int は 32bit。ということで不公

元記事を表示

[Go]メソッド

# 概要

* [前回](https://qiita.com/hasesiu/items/993a2e20c70219f016e2)の続き
* 今回はメソッドについて学習
* 教材を読むに、次のインターフェースと合わせて、特に重要な単元のようだ。

参考

https://www.oreilly.co.jp/books/9784814400041/#

# メソッド

* ユーザ定義の型に付随する関数としてメソッドが定義できる
* `func (レシーバ) メソッド名(引数) 戻り値`の形式
* 関数にレシーバが追加されている。レシーバは変数とユーザ定義型を指定する
* Javaとは異なり、オブジェクトとは別の場所で定義しており、紐付にレシーバを使っている。
* また、オーバロードはできなため、一つのレシーバに対して同じメソッド名は複数定義できない

“`go
type Person struct {
name string
age int
}
// メソッド
func (p Person) toString() string {
return

元記事を表示

Go の string と rune 周りのお話し

Go で文字列からN番目の文字を抜き出したい際に、以下のようなコードを想像する方は多いのではないでしょうか?

“`go
s := “Hello World”
fmt.Println(s[0]) // 72
“`

https://goplay.tools/snippet/4YzKExavktD

私もそのうちの一人でした。`fmt.Println(s[0])` の値として期待するのは ”72” ではなく “H” です。この挙動は私が業務で使用している node.js とは異なる挙動で気になったので調べてみました。

# String とは

> In Go, a string is in effect a read-only slice of bytes.
>

https://go.dev/blog/strings#what-is-a-string

Go において string は read-only な byte のスライスです。

つまり、`fmt.Println(s[0])` の値として表示された “72” は byte を表しています。

“`go
s := “H

元記事を表示

ざっくりDDD・クリーンアーキテクチャにおける各層の責務を理解したい①(ドメイン層・ユースケース層編)

# 概要

弊社で開発中のプロダクトは、ドメイン駆動設計とクリーンアーキテクチャを組み合わせた設計となっています。
これまでフロントエンドの開発を担当することが多かった中で、golangでのAPI開発を担当した際に、「この処理はRepositoryに書くべき?」「Usecaseにこの処理を書いたら責務を持たせすぎ?」「Domain ServiceとUsecaseはどう分ける?」など迷うことが多々ありました。

そこで、これら設計に関する考え方を整理するために具体的な実装を踏まえてこの記事を書いています。
この後、インフラストラクチャ層・プレゼンテーション層は別の記事として書く予定です。

# DDD(ドメイン駆動設計)とは

> ドメインの専門家からの入力に従ってドメインに一致するようにソフトウェアをモデル化することに焦点を当てるソフトウェア設計手法である。
>[ドメイン駆動設計](https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88)

元記事を表示

【Go】ログイン機能でウェブアプリを作ってみる(12)

こんにちは。

Part 12は「リフレッシュ /auth/refresh」です。

現在、有効期限24時間のアクセストークンで認証を行なってます。
「認証の時間を伸ばしたい!でもアクセストークンの期限は伸ばしたくない・・・」
そんな場合はどうしましょうか。

解決方法の1つとしてリフレッシュトークンという別のトークンを使います。
アクセストークンとリフレッシュトークンの違いはこんな感じです。

– アクセストークン
– 認証トークン。制限されたリソースにアクセスするときに使う
– 有効期限が短い(今回は30分)
– Authorizationヘッダーでやり取りする
– リフレッシュトークン
– アクセストークンを再取得するため、だけのトークン
– 有効期限が長い(今回は3日)
– アクセストークンが期限切れの場合、リフレッシュトークンを使ってアクセストークンを再取得できる
– 今回はCookieでやり取りする

では、このリフレッシュトークンが使えるように変更していきましょう!

# 今回の目標
– ログイン時にリフレッシュトー

元記事を表示

Regoを使ってAPIのアクセス制限をしてみる

# はじめに
どうも僕です。

先日、セキュリティキャンプがありましたね。そこで面白そうなものがありました。

Ebitengineの環境構築にちょっと苦労した話

# 目次
1. [概要](#概要)
1. [課題](#課題)
1. [やったこと](#やったこと)
1. [結論](#結論)
# 概要
Ebitengineの環境構築の確認(https://ebitengine.org/en/documents/install.html)
をやろうとしたらエラーが出た
# 課題
“`powershell
go run github.com/hajimehoshi/ebiten/v2/examples/rotate@latest
“`
で確認する。
エラーがでた
“`
package github.com/hajimehoshi/ebiten/v2/examples/rotate@latest: can only use path@version syntax with ‘go get’ and ‘go install’ in module-aware mode
“`
# やったこと
エラーは参照の方法をGOPATHからモジュールにしろっていうことっぽい
modファイル作ってmain()で動かしてみる。
“` power

元記事を表示

【Go】Minioソースコード解析(1) – エントリポイント、ビット腐敗アルゴリズム、サーバーエントリーポイント

# 【Go】Minioソースコード解析(1) – エントリポイント、ビット腐敗アルゴリズム、サーバーエントリーポイント

MinIOは、高性能で高可用性の分散オブジェクトストレージソリューションを実現するためのオープンソースオブジェクトストレージサーバーです。これはAmazon S3(Simple Storage Service)と互換性があり、プライベートクラウドストレージ、パブリッククラウドストレージ、バックアップ、アーカイブ、大規模データストレージなど、さまざまなアプリケーションシナリオに使用できます。MinIOは大規模データのストレージ、高速データ転送、オブジェクトメタデータのストレージと検索をサポートしています。

MinIOの主な特徴と用途は次のとおりです:

1. **分散オブジェクトストレージ**:MinIOは水平にスケーリングでき、データを複数のストレージノードに分散して高性能とスケーラビリティを提供します。

2. **高性能**:MinIOの設計目標は、高いスループットと低遅延のデータ転送を提供し、大容量ファイルの高速読み書きが必要なアプリケーションに適しています

元記事を表示

[プロトコルバッファ] protoc-gen-go: program not found or is not executable の解決方法

## 概要

Go言語で分散サービスを書く方法を学びたいと思い立ち、「[Go言語による分散サービス
―信頼性、拡張性、保守性の高いシステムの構築]」(https://www.oreilly.co.jp/books/9784873119977/) で勉強を始めました。
その中「2.4 プロトコルバッファのコンパイル」で次のエラーで困った時の解決法のメモです。

“`console
~/proglog/StructureDataWithProtobuf$ protoc api/v1/*.proto –go_out=. –go_opt=paths=source_relative –proto_path=.
protoc-gen-go: program not found or is not executable
Please specify a program using absolute path or make sure the program is available in your PATH system variable
–go_out: protoc-gen-go: P

元記事を表示

Go(echo)で簡易的なCookieを実装してみた

# はじめに

以前、[Go(echo)とMySQLでAPIサーバーを構築](https://qiita.com/T_death/items/e5d99d26b235ddf7659a)してみました。それの続きとして今回は、Go(echo)を使ったCookieの実装をしてみました。
サーバー構築とかバックエンドとか全然やったことなかったので、無知が故に沼った箇所が多々ありました。自分への戒めとして、それらも記述したいと思います。

## 実装した処理の流れ

* フロント → localhost:3000
* バック → localhost:8080
* localhost:3000→localhost:8080/setSessionに、データをPOSTメソッドで送る+Cookieの作成
* localhost:3000→localhost:8080/readSessionに、GETメソッドでブラウザ側にCookieがあるかを確認

たったこれだけ。

## GoとCookie

まずはCookieとは何かを知る必要があり、さらにそれをどのようにGoで実装するのかを知る必要がありまし

元記事を表示

Goのディレクトリ構成の標準について

### GoでWebAPIを作成するにあたり、Goのディレクトリ構成に標準が存在するということで、調べた結果をアウトプットします。

## 目次
1. Goのディレクトリ構成について
2. ディレクトリ構成一覧
3. 各ディレクトリの意味
4. 参考にしたサイト

## 1. ディレクトリ構成について
#### Goのアプリケーションプロジェクトの基本的なレイアウトとなります。
Go開発チームによって定義された公式の標準ではありません。
これまでの大規模プロジェクトに共通するフォルダ構成になっているようです。

## 2. 一覧
“`
┣━Project名/
┃  ┣━cmd
┃  ┣━internal
┃  ┣━pkg
┃  ┣━vender
┃  ┣━api
┃  ┣━web
┃  ┣━configs
┃  ┣━init
┃  ┣━scripts
┃  ┣━build
┃  ┣━deployments
┃  ┗━tests
┗━docker-compose.yml
“`

## 3. 各フォルダの意味
### 1. /cmd
#### 本プロジェクトのメイン

元記事を表示

Go言語向けNCMB SDKの使い方(InstallationのCRUD操作)

NCMBはモバイル向けのBaaS(mobile Backend as a Service)ですが、サーバー側のデータとNCMB上のデータを連係させたいというニーズは良くあります。

そんなときには各言語向けのSDKがあると便利です。サーバー向けにはRuby、Python、PHP、Java、C#のSDKがあります(すべて公式サポート対象外の、コミュニティSDKという位置づけです)。

新しくGo言語向けのSDK開発をはじめたので、その使い方を紹介します。今回はInstallation(デバイストークン)のCRUD操作について解説します。

## ソースコード

ソースコードはGitHubにて公開しています。ライセンスはMIT Licenseになります。

[NCMBMania/ncmb\_go](https://github.com/NCMBMania/ncmb_go)

## インストール

SDKのインストールは下記コマンドで行います。

“`bash
go get -u github.com/NCMBMania/ncmb_go
“`

## インポート

続けてSDKをインポー

元記事を表示

Go言語向けNCMB SDKの使い方(ロールのCRUD操作)

NCMBはモバイル向けのBaaS(mobile Backend as a Service)ですが、サーバー側のデータとNCMB上のデータを連係させたいというニーズは良くあります。

そんなときには各言語向けのSDKがあると便利です。サーバー向けにはRuby、Python、PHP、Java、C#のSDKがあります(すべて公式サポート対象外の、コミュニティSDKという位置づけです)。

新しくGo言語向けのSDK開発をはじめたので、その使い方を紹介します。今回はロール(グループ)のCRUD操作について解説します。

## ソースコード

ソースコードはGitHubにて公開しています。ライセンスはMIT Licenseになります。

[NCMBMania/ncmb\_go](https://github.com/NCMBMania/ncmb_go)

## インストール

SDKのインストールは下記コマンドで行います。

“`bash
go get -u github.com/NCMBMania/ncmb_go
“`

## インポート

続けてSDKをインポートします。

“`go

元記事を表示

OpenTelemetry で始める分散トレース

昨今、オブザーバビリティという言葉を耳にすることが増えました。オブザーバビリティとは、システムの状態をどれだけ理解し説明できるかを示す尺度です。

近年のソフトウェアは分散システムに始まり複雑化しているため、挙動を把握するための情報を集めて分析することで、システムを理解できるようにすることが重要です。このような情報にはメトリクス・トレース・ログがあり、[OpenTelemetry](https://opentelemetry.io/) はこれらを取得するためのOSSツールです。

この記事では、OpenTelemetry を使ってトレースを取得しようとしている方向けに、色々なケースで取得する方法を紹介します。

# 前提
言語:Golang 1.20.3
実行環境:GCP Cloud Run

# 分散トレースの重要性
分散トレース(単にトレースとも呼ばれます)とは、1つのリクエストがアプリケーションを構成するさまざまなサービスによって処理される過程を追跡する方法です。
処理過程のどこで障害が発生しているか、パフォーマスが低下しているかという原因を特定するのに有効です。

元記事を表示

【翻訳】Goの落とし穴集 (原題: 50 Shades of Go)

少し前の記事ですが、勉強になったので、翻訳で共有させて頂きます。

[元記事](https://golang50shad.es/)のタイトルは `50 Shades of Go: Traps, Gotchas, and Common Mistakes for New Golang Devs` です。(50 shades of ~ は`Fifty Shades of Grey` という小説のもじりだと思います。)

※作者の方の許可も[頂けました](https://twitter.com/kcqon/status/1691301160307888128)。

# 概要

Goはシンプルで楽しい言語ですが、他の言語と同様に、いくつかの落とし穴があります… 落とし穴の多くは、必ずしもGo言語に責任があるとは言えません。これらのミスの中には、別の言語からGoに移る際に自然と引っかかってしまう罠もありますし、開発者の誤った思い込みや詳細の見落としに起因するものもあります。

これらの落とし穴の多くは、時間をかけて公式の仕

元記事を表示

OTHERカテゴリの最新記事