- 0.0.1. 図解 io.Pipe(Golang)
- 0.0.2. 図解 io.TeeReader(Golang)
- 0.0.3. [2022年]WindowsでGoを始める
- 0.0.4. Go×Dockerで環境構築を実施する。
- 0.0.5. mac(intel)で公式インストーラでインストールしたgoを1.18にアップデート
- 0.0.6. 【Golang】fmt.Errorfとerrors.Newの違い
- 0.0.7. Go の rune 型を試してみる
- 0.0.8. Goのpackage github.com/mattn/go-sqlite3 is not a main packagetとかいうエラー
- 0.0.9. 【A Tour of Go】 並行処理編
- 0.0.10. オライリー書籍ランキング1[O’Reilly]
- 0.0.11. go getがつかえない。(oapi-codegenのインストール)
- 0.0.12. 5分でわかるGo言語の文法まとめ
- 0.0.13. GoのScanfでunexpected newlineが出た話
- 0.0.14. 【Golang】PHP の serialize のようにオブジェクトを保存可能なデータにしたい【gob】
- 1. Go でオブジェクトをシリアライズ(シリアル化)したい
図解 io.Pipe(Golang)
# はじめに
Goのioパッケージにはio.Readerやio.Writerのインターフェイスを有効活用するための便利なメソッドがいくつか用意されています。
自分はその中の一つである`io.Pipe`の挙動を理解するのに手こずったので、備忘録として挙動や使い方を残しておこうと思います。# [io.Pipe](https://pkg.go.dev/io#Pipe)とは
io.Pipeメソッドは、io.PipeReaderとio.PipeWriterを返します。io.PipeWriterに書き込んだ内容が、io.PipeReaderから読み出せるようになります。
io.Pipeの特徴は、内部バッファを持たない点にあります。そのため、Writerに書き込んだ内容がすぐにReaderから読み出せるようになります。モデル図はこんな感じです(2のブログから引用)。
自分なりの理解を図にまとめると以下
図解 io.TeeReader(Golang)
# はじめに
Goのioパッケージにはio.Readerやio.Writerのインターフェイスを有効活用するための便利なメソッドがいくつか用意されています。
自分はその中の一つである`io.TeeReader`の挙動を理解するのに手こずったので、備忘録として挙動や使い方を残しておこうと思います。# [io.TeeReader](https://pkg.go.dev/io#TeeReader)とは
io.TeeReaderメソッドは、引数で渡したio.Readerを、読み込まれた内容を2番目の引数で渡したio.Writerに書き込むio.Readerに変換するメソッドです。
自分はio.Readerを進化させるメソッドだと理解しました。イメージはこんな感じです。
## サンプルコード
“
[2022年]WindowsでGoを始める
以下のサイトで環境構築がおすすめです。
[WindowsにGo言語をインストールする方法まとめ](https://qiita.com/yoskeoka/items/0dcc62a07bf5eb48dc4b)サンプルです。
“`sample.go
package mainimport “fmt”
func main() {
var a [3]int
a[0] = 100
a[1] = 200
a[2] = 300
fmt.Println(a)var b [3]string = [3]string{“Go”, “Python”, “JavaScript”}
fmt.Println(b)
}
“`コマンドで実行します。
sample.goが置いてあるファイルに移動し、
“`
go run sample.go
“`
結果は
“`
[100 200 300]
[Go Python JavaScript]
“`
です。終わります。
***
>他の記事
・[[2022年]WindowsでGoを始める](https://qiita.com/netineti5
Go×Dockerで環境構築を実施する。
### 1. Go×Dockerで環境構築を実施する。
Go×Dockerは最近のナウイ開発ではよくこの構成になっています。本記事では`Go×Docker`の環境構築の方法を記載しております。
### ①go moduleを作成する
go modはGoのアプリケーションルートのようなものです。値はなんでも良いのですが、`github.com/ユーザ名/アプリケーション名`が慣例となっています。
“`shell:go module
~/develop/go_docker $ go mod init github.com/kouji0705/go_docker
go: creating new go.mod: module github.com/kouji0705/go_docker
“`##
mac(intel)で公式インストーラでインストールしたgoを1.18にアップデート
go初心者の備忘メモ。
以下の記事を参考にしました!
https://shinshin86.hateblo.jp/entry/2020/05/08/060000goが`/usr/local/go`配下にインストールされているので、そのディレクトリごと消す。
“`
sudo rm -rf /usr/local/go
“`その後公式のダウンロードページから必要なインストーラを取得して、インストールするだけ。
https://go.dev/dl/確認
“`
$ go version
go version go1.18.3 darwin/amd64
“`
完
【Golang】fmt.Errorfとerrors.Newの違い
### 変数を埋め込みたい時は `fmt.Errorf`を使う
“`go
err := fmt.Errorf(“error create token: %w”, err)
“`### 固定の文字列の時は `errors.New`を使う
“`go
err := errors.New(“invalid format”)
“`
Go の rune 型を試してみる
## 前回
https://qiita.com/BitterBamboo/items/14a0d667ed4dbe2d549b
文字列を for-range で回す際に、
繰り返しの要素(1文字1文字)が `string` 型として現れることを期待していたのですが、
なんと **`rune` 型という気味の悪い型**([元ネタ](https://www.itmedia.co.jp/news/articles/1806/08/news065.html))が代わりに現れて少々困惑してしまいました。今回はそんな `rune` 型の基本的な挙動を確認してみました。
## `rune` 型の入出力
まず大前提として、`rune` は `int32` のエイリアスであり、
さらに Unicode のコードポイント(10進数表記)に該当するのでした。`rune` 型の変数に格納できる値は2種類あります。
* `int32` 型の数値
* `rune` リテラル### `int32` 型の数値
“`go:int32 型の数値
package mainimport “fmt
Goのpackage github.com/mattn/go-sqlite3 is not a main packagetとかいうエラー
go初心者です。
go1.18 darwin/arm64を使っています。このエラーの解決方法(個人的に)を残したいと思います。
①brew なりでsqlite3をインストールします。
②自分のPJのディレクトリでgo mod initします。
“`
go mod init github.com/mattn/go-sqlite3
“`
③go.modのあるディレクトリでgo mod tidyをします。
“`
go mod tidy
“`これで使えるようになるはずです。
【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://amzn.to/3aILwT3)

– 第I部データシステムの基礎
– 1章 信頼性、スケーラビリティ、メンテナンス性に優れたアプリケーション
– 2章 データモデルとクエリ言語
– 3章 ストレージと抽出
– 4章 エンコーディングと進化
– 第II部分散データ
– 5章 レプリケーション
– 6章 パーティショニング
– 7章 トランザクション
– 8章 分散システムの問題
– 9章 一貫性と合意
– 第III部導出データ
– 10章 バッチ処理
– 11章 ストリーム処理
– 12章 データシステムの将来
***
[ソフトウェアアーキテクチャの基礎[Amaz
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
ファイルディスクリプタに対する書き込み処理にて内部で保持している使用済みバッファが