- 1. Go でオブジェクトをシリアライズ(シリアル化)したい
- 1.0.1. GoでZIPファイル扱う
- 1.0.2. go開発環境をDockerで作成する③
- 1.0.3. AWS S3のmockを作成してGitHub Actionsで自動テストを実行する
- 1.0.4. [golang] Go言語は、map、slice、arrayは定数化出来ない仕様。では代用策は?
- 1.0.5. 【A Tour of Go】 インターフェース編
- 1.0.6. Go の気になったコミット (2022 年 5 月)
- 1.0.7. Excelデータベースをブラウザで絞り込み検索
- 1.0.8. 【A Tour of Go】メソッド編
- 1.0.9. Go 言語でスライスのポインタに対して Index を指定して要素を取得する
- 1.0.10. go開発環境をDockerで作成する②
- 1.0.11. ASP.NET Core Blazor WebAssembly 公開について
- 1.0.12. Go で文字列を for-range で回したら rune 型が出た件
- 1.0.13. Goのgoroutine, channelを使って並列処理
- 1.0.14. go開発環境をDockerで作成する①
【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
**インターフェース編**
https://qiita.com/BitterBamboo/items/7f3e29b324bcc84c93ed
以下、並行処理について学んだことのメモ。
> Goは言語のコア機能の一部として並行処理機能を提供する(!)
## goroutine
* Go のランタイムによって管理される軽量
オライリー書籍ランキング1[O’Reilly]
2022年5月30~6月5日の書籍ランキングを紹介します。
***
[データ指向アプリケーションデザイン[Amazon]](https://www.amazon.co.jp/%E3%83%87%E3%83%BC%E3%82%BF%E6%8C%87%E5%90%91%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3-%E2%80%95%E4%BF%A1%E9%A0%BC%E6%80%A7%E3%80%81%E6%8B%A1%E5%BC%B5%E6%80%A7%E3%80%81%E4%BF%9D%E5%AE%88%E6%80%A7%E3%81%AE%E9%AB%98%E3%81%84%E5%88%86%E6%95%A3%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E8%A8%AD%E8%A8%88%E3%81%AE%E5%8E%9F%E7%90%86-Martin-Kleppmann/dp/4873
go getがつかえない。(oapi-codegenのインストール)
# Goのバイナリを取得する。
oapi-codegenを使おうと思って、`go get`したら怒られました。
go 1.17以降は`go install`を使わないとだめそうです。
“`
$ go get github.com/deepmap/oapi-codegen/cmd/oapi-codegen@v1.8.2
go: go.mod file not found in current directory or any parent directory.
‘go get’ is no longer supported outside a module.
To build and install a command, use ‘go install’ with a version,
like ‘go install example.com/cmd@latest’
For more information, see https://golang.org/doc/go-get-install-deprecation
or run ‘go help get’ or ‘go
5分でわかるGo言語の文法まとめ
# Java経験者から見たGo言語の文法一覧
※2020年当時書いたものを掲載しているので、Javaの言語仕様の理解が古いかもしれません。。。
ご容赦ください。## 文法規則
### 出力
“`Main.java
public class Main {
public static void main(String[] args) {
System.out.println(“Hello, World”);
}
}
“`“`main.go
package main
import (
“fmt”
)
func main() {
fmt.Println(“Hello World”)
}
“`
※fmtパッケージが必要### 変数
型は最後に書く ※varは変数、letは定数“`test.go
var c, python, java bool //c,python,javaは全てbool型
let swift bool = true //bool
“`★初期化すれば型を書かなくてよい
“`test.go
var i, j i
GoのScanfでunexpected newlineが出た話
Goのコーディング練習も兼ねて、P社の、お題に沿って簡単なプログラムを作成するとレーティングされるアレをやってました。
その中で、思いがけず「unexpected newline」エラーが発生してしまいました。
まあ、知っている人は知ってそうなので例によってポエムです。## 現象
やりたかったのは`0101`みたいな4桁の二進文字列を読み取ること。サクッとScanfを使って以下のようなコードを書きました。
“`go:scanf_binary.go
package mainimport “fmt”
func main() {
const COUNT = 2
var number_decimal intfor i := 0; i < COUNT; i++ { if _, err := fmt.Scanf("%04b", &number_decimal); err != nil { fmt.Println(err.Error()) break } } } ``` これを実際に動かすとこうなります。 ``
【Golang】PHP の serialize のようにオブジェクトを保存可能なデータにしたい【gob】
Go でオブジェクトをシリアライズ(シリアル化)したい
> Go 言語(以下 Golang)で、オブジェクトを保存 & 読み込みできるように[シリアライズ](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%A9%E3%82%A4%E3%82%BA)したい。
JSON 文字列に変換してもいいのですが、`json.Marshaler` や `json.Unmarshaler` インターフェースを実装しないといけないものだと面倒です。
特に、ユーザーが保存データを直接編集する必要もないし、他のプログラム言語とのやりとりもない場合に、PHP の
serialize
くらい**簡単に保存可能な値に変換できないものか**悩みます。[「”golang” phpのserializeみたいなもの」でググって](https://www.goo
GoでZIPファイル扱う
# はじめに
PHPerだった私にはGoのZIPファイルの取り扱い方が少々ややこしかったので、忘れたときのために覚書を残すことにした。# ZIPファイルの読み方
基本的な手順はこちら。
1. ZIPファイルを開く
1. 個別のファイルエントリーを取得
1. ファイルエントリーの情報が欲しい場合はFileHeader要素から取得
1. ファイルエントリーの中身を見たい場合はオープン
~~~go:reader.go
package mainimport (
“archive/zip”
“io”
)// エラー処理は省略
func main() {
zipfile, _ := zip.OpenReader(“./sample.zip”) // 1. ZIPファイルを開く
defer zipfile.Close()
for _, entry := range zipfile.File { // 2. 個別のファイルエントリーを取得
println(entry.FileHeader.Name) // 3. ファイルエントリーの情報が欲しい場合はFileH
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」であり、定数はコンパイル時に生成されます。
対して配列やスライスはプログラム実行時に生成されます。## 代用策
### 1: [要素数]string(またはint){要素1,要素2,・・・} 形式で定義。
– Pros: 直観的で、行数も少なくて済む。
– Cons: 結局は変数なので、簡
【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検索をできるようにします。
FZF本家の実行画面。ファイルを絞り込み検索しています。## 完成形

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/amd64VisualStudio 2022(以下vs2022)
vs2022のテンプレートから、アプリケーションを作成後のリリースで
Blazor Serverであれば、dllを実行できる環境でdotnet runしまえば、問題は特にないのですが、
blazorWasmには、dllがなく当時私が困ったので、今後や、たまたま記事を見つけた人のためのメモblazorWasmは公開後、指定のフォルダーにwwwrootフォルダーがあり、その中身が
リリースに必要なフォルダーですが、中
Go で文字列を for-range で回したら rune 型が出た件
やっぱりGoでも文字列は配列みたいなノリで扱えるのか〜という所感
— BitterBamboo (@bitter_bamboo) June 4, 2022
このように、文字列を直感的に配列の如く扱っていいだろうと高を括っていたら、
`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では試験