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

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

GoでWebアプリケーションを作る(1)

こんにちは。

今日からはGo言語を使って簡単なWebアプリケーションを作成します。

# 目的
– あなたがプログラミングを行う際の選択肢として、Goを挙げられる為の第一歩となること
– より、知らない人に知ってもらうことを重要視しています

# 全体の流れの確認
– Goとは
– 特徴
– どこで使われているの?
– Hello, World作成
– 実行
– クロスコンパイルの体験
– 変数とその定義方法
– 変数の種類
– 変数定義方法
– 不具合箇所は、最高の講師に教えてもらおう
– 不具合の修正
– 関数
– 関数の定義
– 関数を書いてみる
– 関数の実行される順番
– パッケージ
– パッケージを使う
– パッケージを作る
– 構造体
– 構造体の定義
– 構造体への関数の関連付け
– 牛丼屋型と、注文する関数を定義する
– Webアプリケーション
– httpを起動する方法
– はじめてのGo言語Webアプリケーシ

元記事を表示

[Go]string、Rune、コードポイント、[]byteの差異について

各概念の説明は参考ページにわかりやすく記述されていますのでそちらをご参照ください。
ここでは、概念の違いに注目して理解を深めることや端的に表現することを目的としています。

## byte型とstring型について

“`go

var scentence string

//スライス作成←scentence[index]はbyte型:1byteごとに区切られる

codePointPre := []byte{scentence[index]} //[]byteにコードポイントが格納される

//バイト配列へ変換←scentence[index:index+1]はstring型

codePointPre := []byte(scentence[index:index+1]) //[]byteにコードポイントが格納される
“`

1.Goが準拠するUTF-8は可変長エンコーディング。
文字列にインデックスでアクセスしたときに得られるbyte値は1byteごとであるので、scentenceは英数字の場合にのみ対応。マルチバイト(かなカタカナ漢字)にはstringをbyteにキャスト

元記事を表示

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

元記事を表示

OTHERカテゴリの最新記事