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

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

go開発環境をDockerで作成する③

# 最終目的
– go言語でWebアプリを構築するためのgo開発環境をDockerで作成する。

# 目標
– [Docker上にコンソール立ち上げ環境を作る。](https://qiita.com/eigetsu/items/555efb6f1fec0425d35f)
– [フレームワークginを使った簡単なREST APIサーバーを立ち上げる。](https://qiita.com/eigetsu/items/5482149b4f5cf7874698)
– イメージビルド時にプログラムをコンパイルしコンテナ起動と同時にホストPCからAPIにアクセスできるようにする。←いまここ

## 開発環境の構成

開発環境 `go-env` の構成は下記の通り。

~~~text: 開発環境
go-env/ ★ 開発環境構成 go-env はGitHubのレポジトリ
├── docker-compose.dev.yml
├── env/
│   └── Dockerfile.blog.dev ★ go-blogのDocke

元記事を表示

AWS S3のmockを作成してGitHub Actionsで自動テストを実行する

# はじめに
CRUDなWebアプリケーションを開発する際に、外部ストレージとして`AWS S3`を選定し、ファイルのアップロード処理やダウンロード処理などを実装する場合が多々あると思います。
`AWS S3`のようなマネージドサービスに依存するビジネスロジックに関しても単体テストもしくは統合テストをきちんと書き、自動テストを実行したい!! といった場合に役立ちそうな内容を記事にまとめます。

# 選定したツール
今回は`localstack`という、AWSのマネージドサービスをモッキングするためのツールを使用します。
`localstack`を使用することで、AWSの多くのマネージドサービスをモッキングすることが可能となります。
ツールを利用する際に一部有料となってしまう部分も存在しますが、今回モッキングを行いたいS3に関しては利用に際して無料となっているので、特に問題なく開発が行えそうです。

https://github.com/localstack/localstack

## 選定理由
`localstack`を選定するに至るまでいくつかの方法でS3をモックしてのテスト実行方

元記事を表示

[golang] Go言語は、map、slice、arrayは定数化出来ない仕様。では代用策は?

【参考資料】
– [Effective Go: Constants](https://go.dev/doc/effective_go#constants)
– [[Golang] array と slice と map を定数として使えない](https://tech.notti.link/02b52f2)
– [go – Declare a constant array – Stack Overflow](https://stackoverflow.com/questions/13137463/declare-a-constant-array)

【実行環境】
– Go for Windows:1.18

## 理由
定数として使えるのは「数字」「文字(runes含む)」「boolean」であり、定数はコンパイル時に生成されます。
対して配列やスライスはプログラム実行時に生成されます。

## 代用策

### Type-1: […]string(intも可){要素1,要素2,・・・} 形式で定義。
– Pro: 直観的で、行数も少なくて済む。
– Con: 結局は変数

元記事を表示

【A Tour of Go】 インターフェース編

公式の [A Tour of Go](https://go-tour-jp.appspot.com/list) ではじめて Go 言語を触ってみました。

**基本編**

https://qiita.com/BitterBamboo/items/58d80a1a1a85e18188ce

https://qiita.com/BitterBamboo/items/f72ce6f7ce20e6b5f6c7

https://qiita.com/BitterBamboo/items/6732a7a9fb2c904641b1

**メソッド編**

https://qiita.com/BitterBamboo/items/1fbd9ff6d0ec8d064062

以下、インターフェースについて学んだことのメモ。

## インターフェース

### インターフェース型

* インターフェース型は、メソッドのシグネチャの集まりとして定義する
* シグネチャ: 名前, 引数や戻り値の型
* インターフェース型の変数には、インターフェースを実装した型 *(= インターフェースで定義したメソッドの

元記事を表示

Go の気になったコミット (2022 年 5 月)

[golang/go](https://github.com/golang/go) の master ブランチに行われたコミットから個人的に気になったものをリストにしたものです。

前回作成したリストはこちら。

https://qiita.com/sg0hsmt/items/a23550509237e06361f2

軽く説明を追加していますが勘違いや誤りがあるかもしれません。

## Topic

– BoringCrypto を使うための `dev.boringcrypto` ブランチが master にマージされました。 :tada:
– 環境変数 `GOMEMLIMIT` でメモリ使用量のソフトリミットを設定できるようになりました。
– 標準パッケージにジェネリクスが導入されました。

## Commits

### 2022-05-02

https://github.com/golang/go/commit/32acceb359717e434ceb48681426b377b722d11e

ファイルディスクリプタに対する書き込み処理にて内部で保持している使用済みバッファが

元記事を表示

Excelデータベースをブラウザで絞り込み検索

# 概要
* サンプルデータの準備
* バックエンド実装
* HTMLテンプレート
* フロントエンド実装

## モチベーション
Excelで管理されているデータベース()のデータをFZFライクに絞り込み検索できるようにします。
全員のPC内にfzfやらターミナルやらxlsx2csvのようなツールが入っていないので、ブラウザの表示を通してサーバー経由でExcelのFuzzy検索をできるようにします。

![demo-fzf.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113494/d6df9b8d-322a-a539-cd64-f8326423d930.gif)
FZF本家の実行画面。ファイルを絞り込み検索しています。

## 完成形
![demo-excel-fzf.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113494/f501670d-b7e0-4903-b57a-0b7718a3b077.gif)
E

元記事を表示

【A Tour of Go】メソッド編

公式の [A Tour of Go](https://go-tour-jp.appspot.com/list) ではじめて Go 言語を触ってみました。

前回の記事(基本編)はこちら

https://qiita.com/BitterBamboo/items/58d80a1a1a85e18188ce

https://qiita.com/BitterBamboo/items/f72ce6f7ce20e6b5f6c7

https://qiita.com/BitterBamboo/items/6732a7a9fb2c904641b1

以下、メソッドについて学んだことのメモ。

## メソッド

### 基本

* Go にはクラスの仕組みはないが、型にメソッドを定義できる
* メソッドは、レシーバを引数にとる
* レシーバはメソッドを定義する対象となる型
* 構造体だけでなく任意の型にメソッドを定義できる
* `type MyFloat float64`
* レシーバを伴うメソッドを宣言するには、レシーバの型が同じパッケージ内に存在しなければならない

“` go
p

元記事を表示

Go 言語でスライスのポインタに対して Index を指定して要素を取得する

# Go 言語でスライスのポインタに対して Index を指定して要素を取得する

普通のデータ型のようにポインタ参照しようとするとできない。

“`go:構造体
type Users struct {
Name string
Score *[]int
}

tanaka := Users{Name: “田中”, Score: &[]int{1, 2, 3}}
satou := Users{Name: “佐藤”, Score: &[]int{1, 2, 3}}
users := &[]Users{tanaka, satou}
“`

“`go:NG パターン
for i, v := range *users {
log.Printf(“名前 %v”, v.Name[i]) // こっちはポインタじゃないので問題なし
log.Printf(“スコア %v”, *v.Score[i]) // こっちはポインタ参照してるのにダメ
}
// エラー: invalid operation: cannot index v.Score (variable of type *[]

元記事を表示

go開発環境をDockerで作成する②

# 最終目的
– go言語でWebアプリを構築するためのgo開発環境をDockerで作成する。

# 目標
– [Docker上にコンソール立ち上げ環境を作る。](https://qiita.com/eigetsu/items/555efb6f1fec0425d35f)
– フレームワークginを使った簡単なREST APIサーバーを立ち上げる。← 今ここ
– [イメージビルド時にプログラムをコンパイルしコンテナ起動と同時にホストPCからAPIにアクセスできるようにする。](https://qiita.com/eigetsu/items/a3eeffa3df2bac413dde)

## Goのフレームワークの選定
フロントエンドはWebだけとは限らない。バックエンドとフロントエンドは分け、JSONでやり取りするRESTful APIとする。
GitHubのStars、Forks、日本での利用数、Echoはリリースが頻繁なのも(良いも悪いも)気になったので、ginを選択。

https://github.com/gin-gonic/gin

## 簡単なAPIサーバーを考える

環境構

元記事を表示

ASP.NET Core Blazor WebAssembly 公開について

あ、すいません
過去に投稿された記事、現在進行系で書いている記事についてですが
あくまでも、私のメモなので
チュートリアル、ドキュメントではないので、注意してください
それでも、よかったら見てください

用事で、ASP.NET Core Blazor WebAssembly(以下blazorWasm)を使うことがあり、
アプリケーションを公開するときに、すごく困ったのでメモ;

環境
.net6.0 version 6.0.300 windows
go version go1.18.3 windows/amd64

VisualStudio 2022(以下vs2022)

vs2022のテンプレートから、アプリケーションを作成後のリリースで
Blazor Serverであれば、dllを実行できる環境でdotnet runしまえば、問題は特にないのですが、
blazorWasmには、dllがなく当時私が困ったので、今後や、たまたま記事を見つけた人のためのメモ

blazorWasmは公開後、指定のフォルダーにwwwrootフォルダーがあり、その中身が
リリースに必要なフォルダーですが、中

元記事を表示

Go で文字列を for-range で回したら rune 型が出た件

このように、文字列を直感的に配列の如く扱っていいだろうと高を括っていたら、
`for-range` でまさかの `rune` 型が飛び出してきて、見事にぶちのめされました。

## 問題のコード

文字列から “ぴえん(?)” を全て除去するプログラムです。
今回は標準パッケージの `strings.ReplaceAll

元記事を表示

Goのgoroutine, channelを使って並列処理

goのgoroutine,channelを使って並列処理をしてみました。
今回は[郵便局](https://www.post.japanpost.jp/zipcode/dl/oogaki-zip.html)のサイトから各都道府県の郵便番号データを全都道府県分ダウンロードした上で、
これを10件ずつ並列処理で解凍してDBに登録するところまでを試してみました。

## 郵便番号データは以下からダウンロード
[https://www.post.japanpost.jp/zipcode/dl/oogaki-zip.html](https://www.post.japanpost.jp/zipcode/dl/oogaki-zip.html)

## 前提環境
go1.8
“`
# 郵便番号データのcsvはSJISの為、以下のパッケージをダウンロード
go get -u golang.org/x/text/encoding/japanese golang.org/x/text/transform

# DBはmysql ORMはgormを利用
go get -u github.com/go-sq

元記事を表示

go開発環境をDockerで作成する①

# 最終目的
go言語でWebアプリを構築するためのgo開発環境をDockerで作成する。

# 目標
* Docker上にコンソール立ち上げ環境を作る。 **← 今ここ**
* [フレームワークginを使った簡単なREST APIサーバーを立ち上げる。](https://qiita.com/eigetsu/items/5482149b4f5cf7874698)
* [イメージビルド時にプログラムをコンパイルしコンテナ起動と同時にホストPCからAPIにアクセスできるようにする。](https://qiita.com/eigetsu/items/a3eeffa3df2bac413dde)

## goの選定

https://go.dev/doc/devel/release

現在(2022/06/04)、最新のgoは1.18.3。

https://go.dev/doc/go1.18

1.17と1.18で大きな仕様変更(Genericsの導入、Fuzzingが標準機能)あり。今までのアップグレードに比べて最大の変更ではないか?
Genericsは1.19で正式になり、1.18では試験

元記事を表示

Goでシンプルなコマンドラインツールを作ってみた

## はじめに

Goを使ったWebアプリケーション開発を半年以上経験していますが、業務外ではこれまで技術本を読んだり、Udemyなどを使った学習を主にしてきました。
これまでインプットをメインに自己学習をてきたので、これからはアウトプットもしていきたいと思い、Goを使ってコマンドラインツールを作ってみました。

## 作成したもの

今回作成したツールは **[pn-checker](https://github.com/gracefulm/pn-checker)** という「引数で指定した数字が素数かどうか判定するだけのシンプルなコマンドラインツール」です。
**実用性のない**且つ**くだらない**ツールを作ってみたいという思いから、さらに、50%くらいの割合で `Think for yourself, stupid!(自分で考えろバカ!)` と言ってくる仕様にしてみました。
まあ、いわゆるクソコマンドです。

コマンド作成には以下のパッケージを使用しました。

– [spf13/cobra](https://github.com/spf13/cobra)
– コマンドライン

元記事を表示

GridDB クラウド Version 1.2 の紹介

今回は、以前のブログに続いて新しい GridDB クラウドサービスについて紹介します。クラウドサービスの基本については、以前のブログ [GridDB Cloudの紹介][1] をご覧ください。今回は、クラウドサービスのバージョン1.2の新機能について説明します。

GridDBの新バージョンのリリースに伴い、GridDB クラウドに組み込まれた [GridDB Web API][2]が利用可能になりました。WebAPIの基本的な使い方は、[こちら][3]で紹介しています。WebAPIの主な利点は、HTTPリクエストを使ってコンテナを作成し、データを直接データベースにプッシュできることです。これにより、[Telegraf][4]のような他のサービスを使用して、メトリクスや他のデータをGridDBデータベースに記録することが可能になります。

このブログでは、まず`curl`を使った簡単なWeb APIコマンドを紹介します。その後、Telegrafをクラウドサービスにインストールして使用する方法についても紹介します。

## クラウドでGridDB Web APIを使う

Web APIの

元記事を表示

GitHub ActionsでAWS ECS FargateにgRPCサービスを自動デプロイする

# はじめに
AWS ECS にgRPCサービスをFargate起動タイプにて自動デプロイするための設定を作成いたしました。

# 参考にしたテンプレート
GitHub Actions 公式docsに設定に関する解説とテンプレートが記載されているので、そちらを参考にして設定を進めました。

https://docs.github.com/en/actions/deployment/deploying-to-your-cloud-provider/deploying-to-amazon-elastic-container-service
# クラスターとサービスの作成
GitHub Acitonsを使用して自動デプロイを行うためには、あらかじめECS上にクラスターとサービスを作成しておく必要があります。
`aws-cli`を用いてローカル環境からリソースの作成を行うか、もしくはAWSコンソール画面からリソースの作成を行なってください。

# タスク定義について
タスク定義のテンプレートリポジトリ内部にコミットしておきます。

“`json:task-definition.json
{

元記事を表示

【Golang】ステートメントまとめ

# 24 if文

“`go
if result2 := by2(10); result2 == “ok”{
fmt.Println(“great 2”)
}
“`
result2の値をこの式以降使用しない場合は、セミコロン;をつなげて条件式を一行で書くことができる。

# 25 for文
“`go
func main() {
sum := 1
for sum < 10 { sum += sum fmt.Println(sum) } } ``` phpのようにfor文は書けるが、上記のように省略することもできる 初期値をforの前に定義、インクリメントは省略 # 26 range文 ```go func main() { l := []string{"Python", "go", "Java"} for i := 0; i < len(l); i++{ fmt.Println(i, l[i]) } for i, v := range l{ fm

元記事を表示

【A Tour of Go】基本編③ 〜構造体、配列、スライス、マップ〜

公式の [A Tour of Go](https://go-tour-jp.appspot.com/list) ではじめて Go 言語を触ってみました。
以下、構造体、配列、スライス、マップについて学んだことのメモ。

前回の記事はこちら

https://qiita.com/BitterBamboo/items/58d80a1a1a85e18188ce

https://qiita.com/BitterBamboo/items/f72ce6f7ce20e6b5f6c7

## ポインタ

* ポインタは値のメモリアドレスを指す
* 変数`T`のポインタは`*T`型で、ゼロ値は`nil`

“` go
var p *int
“`

* `&`演算子は、そのオペランドへのポインタを引き出す

“` go
i := 42
p = &i
“`

* `*`演算子は、ポインタの指す先の変数を示す(*間接参照*)

“` go
fmt.Println(*p)
*p = 21 // ポインタ p を介して i へ値を代入する
“`

## 構造体

### 構造体とは

* 構造体(`

元記事を表示

【A Tour of Go】基本編② 〜フロー制御〜

公式の [A Tour of Go](https://go-tour-jp.appspot.com/list) ではじめて Go 言語を触ってみました。
以下、フロー制御(for, if, switch, defer)について学んだことのメモ。

前回の記事はこちら

https://qiita.com/BitterBamboo/items/58d80a1a1a85e18188ce

## `for`

* 初期化ステートメント: 最初のイテレーションの前に初期化が実行される
* 条件式: イテレーションごとに評価される
* 条件式の評価が false となった場合にイテレーションを停止
* 後処理ステートメント: イテレーションごとの最後に実行される

“` go
package main

import “fmt”

func main() {
sum := 0
for i := 0; i < 10; i++ { sum += i } fmt.Println(sum) // 0 + 1 + ... + 9 = 45 } ``` * 初期化ステートメントと後処理ステ

元記事を表示

【A Tour of Go】基本編① 〜パッケージ、変数、関数〜

公式の [A Tour of Go](https://go-tour-jp.appspot.com/list) ではじめて Go 言語を触ってみました。
以下、パッケージ・変数・関数について学んだことのメモ。

## パッケージ

### package

* Goのプログラムはパッケージで構成される

“` go
// プログラムは main パッケージから開始される
package main

// “fmt” と “math/rand” パッケージを import
import (
“fmt”
“math/rand” // `package rand` ステートメントで始まるファイル群
)

func main() {
fmt.Println(“My favorite number is”, rand.Intn(18))
}
“`

### import

* `import`ステートメントの書き方
* 括弧で複数の`import`を整理する(*better*)
* 複数の`import`ステートメントを書く

“` go
// factored import

元記事を表示

OTHERカテゴリの最新記事