- 1. xerrorsのerrorチェックの判定方法
- 2. [Go] 1.16 から使える embed で HTML がバイナリに埋め込める!!
- 3. goenvのバージョンを上げる(1系から2系にアップデート)
- 4. Go言語のStruct(構造体)に簡単にタグ付けをするWebアプリを公開しました(ハマったポイント覚書)
- 5. Golang用のマイグレーションツール「migu」使ってみた
- 6. 【Go】ポインタについてまとめてみた
- 7. Gravio 4の日付フォーマットはGo言語の形式を使う
- 8. 【Go Lang】WebFrameWork使ってみた3 iris
- 9. プロキシ環境下でgo getしたい
- 10. Go言語でShift_JISのCSVファイルをUTF-8に変換して読み込む
- 11. Go言語勉強リスト
- 12. goのdocker環境をマルチステージビルドを利用して立ててみる
- 13. 16rep – DBSQLでNull値をInsertしたりSelectで取得する方法
- 14. Simple Go debug with VSCode
- 15. 【Go Lang】WebFrameWork使ってみた2 beego
- 16. SpannerマイグレーションツールRatchetを作りました
- 17. Quicとは何か?
- 18. [Go] net/httpのややこしい関数名・型名を整理する
- 19. reflectパッケージで構造体情報を取得
- 20. 【Go】文字列を一部置換と全置換する方法
xerrorsのerrorチェックの判定方法
### はじめに
開発でgoのテストを書いているときに
errorチェックのテストの書き方の使い分けについて話が出たのでひとつの考え方として残しておく。また、errorのパッケージとして`golang.org/x/xerrors`を使用している。
### 概要
単純にエラーの種類を判断するだけでいいのであれば、`xerrors.Is()`の結果を`assert.True()`に渡してチェックする。
Is()はbaseとなるerrorが両者で一致していればtrueになるので厳密なチェックにはならない。具体的なエラーの内容までを見るのであれば、エラー文字列まで見ないといけないので
`assert.EqualError()`を使用する。### テスト対象のコード
“`golang
package main
import (
“golang.org/x/xerrors”
)var baseDBErr = xerrors.New(“db error”)
var baseCacheErr = xerrors.New(“cache error”)func mai
[Go] 1.16 から使える embed で HTML がバイナリに埋め込める!!
シングルバイナリーがメリットと言われてる Go 言語ですが、HTML などのテンプレートはそのバイナリは埋め込むことができませんでした。
(hugo のようにファイルを生成するツールがあるので、無理くり、埋め込むことはできたんだと思いますが。。)ただ、Go 1.16 から `go:embed` を使うことで、めっちゃ簡単に埋め込むことができるようになりました!!
インポートした後は、これまで通り `http/template` が使えます!
めっちゃ便利なので、おすすめです。
以下、ざっくりとまとめです。
## 参考
https://golang.org/pkg/embed/
https://golang.org/pkg/html/template/## フォルダ配下全てを読み込み
下記のように書くことで、`templates` フォルダ配下のファイルを読み込みできます。
その後は、`f` を経由してアクセスできるようになります。“`go
//go:embed templates
var f embed.FS
“`そう!これだけ!
## 読み込んだテン
goenvのバージョンを上げる(1系から2系にアップデート)
#goenvとは?
goのバージョンを簡単に切り替えられるツール
python使ってる人は、使い方もpyenvと同じ感じ#環境
macOS Big Sur
goenv1系(brew installのもの)
→このgoenvを2系にするよ
#バージョンアップさせた理由(GOPATHの設定)
2系からGOPATHの設定をgoenvがやってくれるようになっているため、
go getでインストールする場所がバージョン別に別れてくれる。##1系と2系のGOPATHの場所の違い
“`
1系のGOPATH
GOPATH=”/Users/user/go”
“`
“`
2系のGOPATH
GOPATH=”/Users/user/go/1.11.4″
“`#前提
goenvのインストールはbrewで1系をインストール。
go installでインストール済み
goenv global で設定も済み
goコマンドを通すため、下記のパスをzshrcに設定ずみ“`
export PATH=”$HOME/.goenv/bin:$PATH”
eval “$(goenv init -)
Go言語のStruct(構造体)に簡単にタグ付けをするWebアプリを公開しました(ハマったポイント覚書)
## はじめに:成果物の紹介
ようこそ!
かわいいGopher君(Go言語のマスコットキャラ)を用意したので、そちらだけでもご覧ください :innocent:【URL】
https://go-struct-tags.com【デモ】
機能は以下の通りです。
– 左のインプット欄に`struct`のコードを貼り付け、タグボタンを押すと、タグのフィールド名やオプションをぽちぽちっと編集できます。
– 今のところ`json`と`xml`に対応
– タグのフィールド名は、もともとの変数名をもとに`camelCase`, `snake_case`, `PascalCase`を選んで一括変換します(手入力も可能)
– 追加・仕様変更要望などあればぜひコメン
Golang用のマイグレーションツール「migu」使ってみた
Goのコードからマイグレーションしてくれるツールないかなあと探していたところ、[migu](https://github.com/naoina/migu)を見つけました。
開発も止まってなさそうなので、とりあえず使ってみることにしました。(2021/2/17時点)サポートされているDBは「MariaDB / MySQL / Cloud Spanner」です。
開発者の方が基本的にMariaDB/MySQLしか使わないためメンテナンスできないことが理由だそうです。
プルリクをもらったらサポートを考えるそうです。#### Dockerで環境構築
“` Dockerfile
FROM golang:1.15.6-alpineENV GO111MODULE on
ADD . /migu_sample
WORKDIR /migu_sample
RUN apk update && apk add –no-cache git mariadb-dev mysql-client
RUN go get github.com/go-sql-driver/mysql &&
【Go】ポインタについてまとめてみた
## はじめに
この**記事の対象**は– ポインタってなんとなく聞いたことあるけど詳しく説明できない
– Goを入門したばかりでポインタの扱い方が分からないという方を対象としています。
**「Goの変数宣言ってどうするの??」**って方は一旦そちらを学んでからの方が理解できるかと思います!また、この記事を読んでくださって、もし「認識が違うよ!」「ここ間違ってるよ!」などがあればご教授ください!
よろしくお願いします!## 出てくるワード
この記事に関係するワードとして、– 変数
– メモリ
– アドレス
– ポインタ
– ポインタ型
– ポインタ変数
– ポインタ値
– デリファレンスなどが出てきます。
今分からなくても、それぞれ説明するので安心してください!
(知らないワードがいくつも出たら思考停止しちゃいますよね…。)## 変数とメモリとアドレスの関係
### それぞれどんなものかをざっくり説明すると、メモリ…データが入ってくる箱のイメージ。
アドレス…メモリを特定する為の住所のイメージ。メモリにデータが格納される時にメモリに付いてくる
Gravio 4の日付フォーマットはGo言語の形式を使う
Gravio 4のマッピングで、日付をフォーマットしたい時は `DateFormat` という関数を使う。
# デフォルトのフォーマット
例えば、LINEにセンサーからデータ取得したい日付を送る場合、そのままだとデフォルトのフォーマットで送信される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/728a751c-62cd-4473-ba41-8bfe77c2b882.png)
“`:cp.Message
tv.Timestamp
“`結果はこう。Web APIなんかにJSONで投げるときはだいたいこのままでもいいですが、LINEやSlackに投げるときには味気ない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/08a3beab-a7ec-cfc1-e568-34a21906a067.png)# 任意のフォーマットに変換する
そういうときに
【Go Lang】WebFrameWork使ってみた3 iris
# はじめに
Go lang WebFrameWorkを使ってみるの三つ目。
人気ライブラリの1~3位を使ってみることにする。[【Go Lang】WebFrameWork使ってみた1 Gin](https://qiita.com/y_nomura_CR/items/9858f2c1e4e1b4d2d2d3)
[【Go Lang】WebFrameWork使ってみた2 beego](https://qiita.com/y_nomura_CR/items/1029d6cd1e24d61831f1)
[【Go Lang】WebFrameWork使ってみた3 iris](https://qiita.com/y_nomura_CR/items/d24f243d7b34522626d5)– Gin
– beego
– iris←今回はコレ# 公式サイトとか
公式サイト(日本語ないです):https://www.iris-go.com/
github:https://github.com/kataras/iris
ライセンス:BSD 3-Clause> BSD 3-Clause
これ
プロキシ環境下でgo getしたい
# What’s?
プロキシ環境下で`go get`して依存モジュールをダウンロードしたい場合はどうしたらいい?と調べてみると、「Gitにプロキシ設定をしたらいい」みたいな情報が見つかるので。
「そうなの?」と思ったので、少し調べてみようかなと。
# go getの説明を見る
`go get`の説明を見てみます。
[Command go / Add dependencies to current module and install them](https://golang.org/cmd/go/#hdr-Add_dependencies_to_current_module_and_install_them)
特にプロキシまわりの話はなさそうです。
コマンドでのヘルプを見てみても、同じですね…。
“`shell
$ go help get
“`# http(s)_proxy環境変数を使う
Gitでプロキシ設定をしてもいいのですが、`https_proxy`(および`http_proxy`)環境変数を使っても機能します。
“`shell
$ export h
Go言語でShift_JISのCSVファイルをUTF-8に変換して読み込む
Go言語でShift_JISのCSVファイルを読み込む場合、UTF-8への変換が必要となるので以下のようにして読み込む。
“`go
package mainimport (
“encoding/csv”
“fmt”
“io”
“log”
“os”“golang.org/x/text/encoding/japanese”
“golang.org/x/text/transform”
)func main() {
f, err := os.Open(“test.csv”)
if err != nil {
log.Fatal(err)
}
defer f()r := csv.NewReader(transform.NewReader(f, japanese.ShiftJIS.NewDecoder()))
var l []stringfor {
l, err = r.Read()
if err == io.EOF {
break
}
if err != nil {
log.Fatal(err)
}
fmt
Go言語勉強リスト
サンプルとして実装して勉強します。
Goは、シンプルで高速で信頼性の高いソフトウェアを構築するために設計されたオープンソースのプログラミング言語です。Go by Exampleは、注釈付きのサンプルプログラムを使用したGoの実践的な紹介です。最初の例を確認するか、以下の完全なリストを参照してください。
– Hello World
– Values
– Variables
– Constants
– For
– If/Else
– Switch
– Arrays
– Slices
– Maps
– Range
– Functions
– Multiple Return Values
– Variadic Functions
– Closures
– Recursion
– Pointers
– Structs
– Methods
– Interfaces
– Errors
– Goroutines
– Channels
– Channel Buffering
– Channel Synchronization
– Channel Directions
– Select
– Time
goのdocker環境をマルチステージビルドを利用して立ててみる
go環境をdockerで構築する際、マルチステージビルドを利用するとコンテナのサイズが小さくなる。各レイヤーごとに処理をわけ、実際に使用するイメージでは必要のない生成物は、それ以前のレイヤーのみが持つように指定することができる。
## マルチステージビルドとは
Dockerfile内にFROM行を複数記述するだけで、ビルドステージを分けることができる。こうすることによって、最終的にイメージに含めたくない内容を除外することが可能になり、その結果、イメージのサイズが小さくなる。## マルチステージビルドを利用しない場合
“`dockerfile:Dockerfile
FROM golang:1.15.7
COPY . .
RUN apt install -y git tar
RUN go build -o /tmp/app main.go
CMD [ “/tmp/app” ]
“`
“`go:main.go
package main
import “fmt”
func main() { fmt.Printf(“hello world!”) }
“`
“`bash
i
16rep – DBSQLでNull値をInsertしたりSelectで取得する方法
# どういうシチュエーション?
– 特定のカラムに対してNULLで入れたい場合# 実際のコード
– [exec を含めないコードサンプル](https://play.golang.org/p/UroXDrFj95M)
– Insertでsample_tableテーブルnum_hogeにnullで入れたい場合そのままですとInsertできません
– db driver側でnullに変えてくれる記述で定義してInsertする必要があります“` go
package mainimport (
“database/sql”
“fmt”
)func main() {
var sampleID int64
sampleID = 0sid := sql.NullInt64{} // sql.NullInt64{}型
/*
// ./src/database/sql/sql.goより
// Nullint64は,nullになる可能性のあるint64を表します
// NullStringと同様にスキャン先として使用することができます
Simple Go debug with VSCode
I’m writing this article out of frustration after trying without success debugging Go on VSCode with [AWS SAM](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html) Lambda local. I then changed to a simpler Go debug and it’s enough development at the moment. This proves that [KISS](https://en.wikipedia.org/wiki/KISS_principle) works without a doubt ?.
#Background
What was supposed to be a simple task of setting [step debugger for AWS SAM with Go progra
【Go Lang】WebFrameWork使ってみた2 beego
# はじめに
Go lang WebFrameWorkを使ってみるの二つ目。
人気ライブラリの1~3位を使ってみることにする。[【Go Lang】WebFrameWork使ってみた1 Gin](https://qiita.com/y_nomura_CR/items/9858f2c1e4e1b4d2d2d3)
[【Go Lang】WebFrameWork使ってみた2 beego](https://qiita.com/y_nomura_CR/items/1029d6cd1e24d61831f1)
[【Go Lang】WebFrameWork使ってみた3 iris](https://qiita.com/y_nomura_CR/items/d24f243d7b34522626d5)– Gin
– beego←今回はコレ
– iris# 公式サイトとか
公式サイト(日本語ないです):https://beego.me/
github:https://github.com/gin-gonic/gin
ライセンス:apache 2.0bee’go’なんだなあ・・・
# 人気
– st
SpannerマイグレーションツールRatchetを作りました
Spannerのマイグレーションツール [Ratchet](https://github.com/hiracchy/ratchet) を作りました。
## 背景
プロダクションで使えるSpannerのマイグレーションツールを調査していて、
wrenchが良さそうだったのですが、以下のような問題がありました。– マイグレーションファイルの名前が連番で作られるため、複数人の開発で競合する
– DMLやパーティション化DMLへの対応がない(現在は、一部対応があるようです)そこで、それらを解決したシンプルなマイグレーションツールを作りました。
## インストール
[リリースページ](https://github.com/hiracchy/ratchet/releases/latest)からダウンロードしてパスを通してください。## 使い方
以下のステップで使えます。シンプルに使えるように心がけました。### 1. マイグレーション用のテーブルを作成する(1回目のみ実行が必要)
“`console
$ ratchet init -p {プロジェクトID} -i {インスタ
Quicとは何か?
# QUICとは
* QUICとは、Googleが高速化を目指し、UDPソケット上に用意したプロトコルです。
* なぜ、Googleはこのquicを作り出したのかというと、それは多分HTTP/2がTCPソケットの上に実装されたものであるからだと考えられます。
* どうしても、TCPは接続初期に何度か往復した通信をする必要があり、エラーや順序の整列をきちんとするために受信通知を返す必要があります。つまり高機能ではあるが、パフォーマンスへの影響が少なからず起こるということです。**では、UDPはどうか?**
UDPは、TCPで行われている再送処理や輻輳制御などを取り払い通信回数を減らすことでパフォーマンスへの影響を減らしたプロトコルです。**では、QUICはどうなのか?**
QUICでは、TCPが行っているようなパケットロス時の再送処理や、輻輳時の制御などを自前で実装しています。
また、TLSの機能を保持しており、シーケンス番号などのデータも隠蔽しています。**じゃあ、HTTPSでのTCPと変わらないのでは?**
HTTPSでは、TCPのハンドシェイク後にTLSのハンドシェイク
[Go] net/httpのややこしい関数名・型名を整理する
## 背景
– GoのHTTP通信に使う標準ライブラリnet/httpには、型名や関数名として似た単語がたくさん出てくる。Handler, HandleFunc, Handleなど。
– それらを整理しておきたい!## net/http.Server
– Goでサーバを立てるにはServer構造体を初期化しなければならない。
– サーバを立てるのに、Server構造体を初期化するというのは、わかりやすい。“`go
$ go doc net/http.Servertype Server struct {
// Addr optionallu specifies the TCP address for the server to listen on,
// in the form “host:port”. If empty, “:http” (port 80) is used.
Addr stringHandler Handler // handler to invoke, http.DefaultServeMux if nil
reflectパッケージで構造体情報を取得
# reflectパッケージ
GO言語におけるreflectパッケージですが、
発生遅くありません?思いついてから実装まで一体何フレかかってんだと。
特にしばらく実装から離れていると、さらに時間がかかりますよね。そこで、そこらへんを少しずつTipsとしてまとめていければと思ってます。
# 構造体の変数名とタグを取得
“`
package mainimport (
“fmt”
“reflect”
)// 構造体
type Skill struct{
p int64 `tag:”弾拳”`
pp int64 `tag:”烈掌”`
ppk int64 `tag:”烈空脚”`
}// 構造体情報を出力
func do(I interface{}) {
v := reflect.ValueOf(I)
t := v.Type()
for i := 0; i < t.NumField(); i++ { name := t.Field(i).Name tag := t.Field(i).Tag.Get("tag") fmt.Println("name=
【Go】文字列を一部置換と全置換する方法
## 準備
文字列の置換には`strings`と言うpackageを使用する為、まずはimportを行います。
https://golang.org/pkg/strings/“`go:import
import “strings”
// 以下でも良い
import (“strings”)
“`## 特定の数のみ置換したい場合
1つだけ置換したい場合や2つなど複数置換したい場合は、`replace関数`を使います。
### 軽く説明
“`go
func Replace(s, old, new string, n int) string
“`
第1引数:置換したい文字列
第2引数:置換前の値
第3引数:置換後の値
第4引数:置換したい数(int型)
返り値:置換された結果の文字列
(stringsのReplace関数なので`strings.Replace()`と言う使い方)### 具体例
“`go:一部置換
var title string = “SSSS.GRIDMAN”
fmt.Println(title) // => SSSS.GRIDMAN// 1つのみ置