- 1. 投稿した背景
- 2. GormのWhere句で条件分岐付きで検索をかけたい
- 2.0.1. Go: Server Sent Events のサンプル
- 2.0.2. めぐる式二分探索法をGoで実装する
- 2.0.3. Go CrossPlatformで各OS依存がある場合のファイル構成
- 2.0.4. Golang単体テストでstruct中身をassertするファクション
- 2.0.5. 突然、業務上必要に駆られたひとのための、Go言語入門
- 2.0.6. Golangはじめて物語(第8話:API Gateway+LambdaでJWTを実装する)
- 2.0.7. Notion APIライブラリまとめ
- 2.0.8. napalm の 6 倍速いネットワーク機器用リモートコマンド実行ツールを書きました
- 2.0.9. Goでinterfaceのポインタを使わない理由と使う場面
- 2.0.10. Golangに入門して詰まったこと【備忘録】 〜これからやりたいことを添えて〜
- 2.0.11. vscode-go で Workspace ごとに Go のバージョンを使い分ける
- 2.0.12. 【Go】本日日付のJST00:00:00をUTC時刻で取得する
- 2.0.13. Mac初心者のGoインストール
Goのvalidatorパッケージで、バリデーションをしつつ空白を許容する場合
1~2ヶ月くらい前からGoを書き始めてるのですが、
下記でハマったというか、 カスタムバリデーションを作ろうとしてしまったので、備忘録的に記載。
Goの[validator](https://pkg.go.dev/github.com/go-playground/validator)で、空白を許容しつつバリデーションをしたい場合、[omitempty](https://pkg.go.dev/github.com/go-playground/validator#hdr-Omit_Empty)タグを利用すれば良い。## 例
“`go
type testForm struct {
code string validate:”omitempty,len=6″`
}
“`## ハマった理由
[required](https://pkg.go.dev/github.com/go-playground/validator#hdr-Required)のバリデーションが存在するのに、なぜ他のバリデーションに関して空白を許容しないのかと混乱しつつ、omitempt
突然、業務上必要に駆られたひとのための、Go言語入門 – おかわり
https://qiita.com/e99h2121/items/68ec25a343d81eaae2e3
を書いたものの…
## Go言語入門、おかわり
やりたいことはなんとなくできるようになったが、もう少しGo言語と仲良くなりたくなったので、続き。以下など参考。
https://qiita.com/suin/items/22662f43b6a6e8728798
### 改めて
https://xn--go-hh0g6u.com/doc/
Go プログラミング言語はオープンソースプロジェクトで,プログラマの生産性を上げます。
> Go は表現力豊かで,すっきりして簡潔,なおかつ効率的な言語です。 並行メカニズムにより,マルチコアでネットワークにつながれたマシンの最大性能を引き出すプログラムを容易に書くことができます。 革新的な型システムがあり,柔軟でモジュール化されたプログラム構成となります。 Go は素早く機械語にコンパイルされます。 ガベージコレクションの便利さもあり,実行時のリフレクションも可能です。 速く,静的型付け,コンパイル言語でありながら,動的型
【Go】プログラム内で定期実行させるライブラリ Cron
docker コンテナ内でcrontabがうまく動作しなかったので、Goプログラム内で定期実行をさせた。
# 実行環境
* golang 1.16.4-buster コンテナ# インストール
“`bash
go get github.com/robfig/cron/v3@v3.0.0
“`
# Cron
まず、コード例“`go:main.go
package mainimport (
“fmt”
“github.com/robfig/cron/v3”
)func main() {
c := cron.New()// 3秒ごと、「Hello World!!」と出力される
c.AddFunc(“@every 3s”, printHelloWorld)// 毎日、午前8時に「Hello World!!」と出力される
// cron式でもスケジューリングの設定ができる
c.AddFunc(“0 8 * * *”, printHelloWorld)//追加したジョブを開始
c.Start()// プログラ
goでwebサーバーを起動する
## memo
* _(アンダーバー)は、アンダースコア変数と呼び、宣言はするが後で使用しない変数を意味する。“`:アンダースコア変数を使用してスライスの中身を取り出す。
for _, value := range values {
fmt.Println(value)
}
“`
“`:スライスからkeyとvalueを取り出す。
for key, value := range values {
fmt.Println(key)
fmt.Println(value)
}
“`## apiのuriからリクエストパラメータを取得する
“`
var param string = r.FormValue(“param1”)
“`## webサーバーを立ち上げる
* main.goファイルの中で `main` 関数が一番最初に実行される
* `go run main.go` でmain.goがコンパイルされたうえで実行され、api用のwebサーバーが立ち上がる。“`:main.go
package mainimport (
“en
Go言語入門 –基本文法–
Go言語の基本構文の説明を整理も兼ねて作成した。他の言語でよく使われる機能そのものの説明はしていない(配列など)。
説明に使用したコードは完全なものでない。コードを試したい時は随時パッケージの[インポート](#パッケージの宣言)や所属するパッケージを宣言(package main)すると良い。
Goの導入や基本的な構造(Hello Worldしただけ)は[この記事](https://qiita.com/KokiSakano/items/cf57210ba894314d6f4e)に書いたので気になる方は参照していただきたい。
# 型
## 数値の型
###整数の型
`int int8 int16 int32 int64`
一般的な整数の型として5つの型がある。
`intN`は$N$ビット幅の値となり、$-2^{N-1}\sim 2^{N-1}-1$の範囲の値を持つことができる。`int`は環境に依存する型であり、一般的に`int64`に相当することが多い(`int32`に相当することも多い)。冒頭に`0`をつけることで8進数、`0x`をつけることで16進数をリテラル表記することができる。
フロントエンド(Nuxt)からheaderにidTokenを乗せて、バックエンド(Go)で認証してレスポンスを返す方法
# なにこれ
筆者がフロントエンド(Nuxt.js)からGoで作ったAPIサーバーにGETリクエストを送りたい!
って時に、Go側でfirebaseの認証をしようとしました。
その実装でかなり詰まったので、解決方法を備忘録として残しておきます。# やりたいこと
– フロントエンドからバックエンドへGETリクエストを送る
– その時に、headerのAuthorizationにfirebaseのidTokenを乗せる
– バックエンドは送られたリクエストからheaderのidTokenを見て、firebase認証する
– okならstatus200とレスポンスを返す
– 認証に失敗したら401を返す## 注意事項
Goを独学して1ヶ月で、もしかしたら記事の内容や自分の認識に間違いがあるかもしれません。
その時は小さな点でも構わないので、ご指摘いただけると非常に助かります!## 前提条件
Goのwebフレームワークにginを使用しています
認証にはfirebase authを仕様## この記事で説明しないこと
firebase authの説明
ginの説明
axiosの説明
GormのWhere句で条件分岐付きで検索をかけたい
投稿した背景
バックエンドの言語はPHPでフレームワークはLaravelを使い続けていた筆者。
つい最近ひょんなことからGolangを使い始めたのである。
GolangのORMであるGormを使用した際にハマってしまったことを解決したので、新しい言語に挑戦するのと同時に Qiitaにも初投稿を試みるのであった。※つまりは本投稿は初投稿かつ基本的なことしか書いてないのでGormもう得意です。って人は読み飛ばして大丈夫かと思います。お手柔らかに。
GormのWhere句で条件分岐付きで検索をかけたい
GormのWhereを使ってmehod chainingする際によく使用されるのは以下の様なコード。
“`
db.Where(“name = ?”, “jinzhu”).Where(“age = ?”, 18).Find(&user)
“`
このコードで実行される実際のSql文は以下のようになる。“`
SELECT * FROM `users` WHERE name = “jinzhu” AND age = 18;
“`しかし、例え
Go: Server Sent Events のサンプル
こちらのページと同じことを行いました。
[Go言語でServerSentEvents(SSE)](https://qiita.com/taqm/items/e132a1aa55690a22b655)![go_server_sent_events.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/c1782f05-b9dd-046c-2223-4b171ca56eca.png)
フォルダー構成
“`text
$ tree
.
├── main.go
└── static
└── index.html
“`“`go:main.go
// —————————————————————
//
// main.go
//
// May/19/2021
// —————————————————————
pa
めぐる式二分探索法をGoで実装する
簡単に調べて、Qiitaで見つからなかったので
# 参考文献
– [めぐる式二分探索](https://twitter.com/meguru_comp/status/697008509376835584)
– [めぐる式二分探索の紹介](https://qiita.com/drken/items/97e37dd6143e33a64c8c)# 実装
“`golang
package mainimport (
“math”
)var a = [10]int{1, 14, 32, 51, 51, 51, 243, 419, 750, 910}
func abs(x int) int {
return int(math.Abs(float64(x)))
}func isOK(index, key int) bool {
return a[index] >= key
}func binarySearch(key int) int {
ng := -1
ok := len(a)for abs(ok-ng) > 1 {
mid := (ok + ng
Go CrossPlatformで各OS依存がある場合のファイル構成
goにてクロスプラットフォームで動作するアプリを作成するのに試したことを備忘録として残す。
各環境(MacとWindows)でメッセージボックスを表示することを(今更)試した。環境
・Go(1.16.3)
・Mojave10.14.6(開発環境)
・Windows10## ソースコード
ディレクトリ構成“`
.
├── util
│ ├── messagebox_darwin.go
│ └── messagebox_windows.go
└── main.go
“`ソースは下記のようになる。
“`go:main.go
package mainimport (
util “crossMsg/util”
)func main() {
util.MessageBox(“title”, “test”)
}
“`“`go:messagebox_darwin.go
package utilimport (
“fmt”
“os/exec”
“strings”
“syscall”
)func MessageBox(title, tex
Golang単体テストでstruct中身をassertするファクション
単体テストを書いていますが、どうやってstructの全てのフィールドをassertionする方法をいくつか案考えていました。
struct全体を比較するは `==` と `reflect.DeepEqual`ができると思いますが
– `==`の場合、structにpointerが入るとfalseになる
– `DeepEqual`はtime.Timeの型が入るとnano秒までの同じじゃないとダメらしいです。
– `DeepEqual`の場合はどのフィールドが相違かどうかがわからないです。
– `DeepEqual`はカスタマイズがしにくいです。例えばあるフィールドをassertionがいらないケースもあるかもしれない。=> `==` と `reflect.DeepEqual`があまりウケてないのでcustomファクションを作りました
まず、このpackageを使う
`github.com/stretchr/testify`“`
func AssertStruct(t *testing.T, expect, actual reflect.Value) {
typeOfExp
突然、業務上必要に駆られたひとのための、Go言語入門
表題のとおりです。とにかく要件を満たすためだけにGoを触らないといけないかもしれない人のために最低限の情報だけ集めた。
https://www.tohoho-web.com/ex/golang.html#about
> Google が開発したプログラミング言語です。「Go言語」や「Golang」と表記されます。
UNIX、B言語(C言語の元)、UTF-8の開発者ケン・トンプソンや、UNIX、Plan 9、UTF-8の開発者ロブ・パイクによって設計されました。
静的型付け、メモリ安全性、ガベージコレクションを備えるコンパイル言語です。
シンプル、高速、メモリ効率が良い、メモリ破壊が無い、並行処理が得意などの特徴を備えています。
メモリ破壊が無く、並行処理を得意とする、進化したC言語という側面があります。
Linux、Mac OS X、Windows、Android、iOS で動作します。## 入門
### インストール
https://golang.org/doc/install“`
C:\workspaces\go>go version
go version go1
Golangはじめて物語(第8話:API Gateway+LambdaでJWTを実装する)
# はじめに
Golang での JWT の実装はライブラリが充実しているので、比較的簡単に実装できる。
しかし、ググって見つかるのは Gin や Echo と組み合わせたものが多く、AWS で API Gateway を使った実例というのが少なかったので、組み込んでみる。本記事は、以下の知識があることを前提とする。
– JWT に関する概要が分かっている(と言っても、あまり難しいことは知らなくてよくて[この記事](https://qiita.com/Naoto9282/items/8427918564400968bd2b)くらいの概要が分かっていれば充分)
– Golang で API Gateway + Lambda の WebAPI を実装したことがある(手前味噌ではあるが、[この記事](https://qiita.com/neruneruo/items/1ef52f908e4497103a59)を読んで理解ができていれば充分)なお、今回は IdP には頼らずに自分で秘密鍵を使ってトークンを払い出して検証するという方式を検証する。
# トークン払い出しの実装
まずは、
Notion APIライブラリまとめ
## Ruby
https://github.com/katsumata-ryo/notionar
## Laravel
https://github.com/5am-code/laravel-notion-api
## Swift
https://github.com/noppefoxwolf/notion
## JS
https://github.com/makenotion/notion-sdk-js
## go
https://github.com/dstotijn/go-notion
https://github.com/ketion-so/go-notion
## python
https://github.com/Blue-Hope/notion-sdk-py
## vue
https://github.com/64robots/vue-notion-api
## PHP
https://github.com/64robots/php-notion
## React
https://github.com/mkalvas/notion-r
napalm の 6 倍速いネットワーク機器用リモートコマンド実行ツールを書きました
ネットワーク機器のコマンドをリモート実行するツール「telee」を書きました。
https://github.com/umatare5/telee
このツールは、機器へのログイン処理とコマンド実行を代理します。
従来の expect スクリプト, NAPALM や Ansible の役割を部分的に担えます。以下は動作例です。
Cisco 社製 OS はもちろん、Juniper, YAMAHA 等、他社製 OS へのログインにも対応しています。
接続プロトコルは telnet もしくは ssh が選択出来ます。その他のプロトコルには対応していません。実行速度を NAPALM の同一機能と比較すると、一般的な用途で 6 – 72 倍高速です。
※ 測定の詳細は [Performance Comparison: telee
Goでinterfaceのポインタを使わない理由と使う場面
# はじめに
Goで「interfaceのポインタは使うことがない」のが定石だけど、`errors.As`のテストケースをみていて有用な場合があるのではと思った。# interfaceのポインタ
https://golang.org/doc/faq#pointer_to_interface
をみると、> Almost never. Pointers to interface values arise only in rare, tricky situations involving disguising an interface value’s type for delayed evaluation.
にあるように、interfaceのポインタを使う場面はほぼないと言っていいようだ。
続いて以下のように続く。> It is a common mistake to pass a pointer to an interface value to a function expecting an interface. The compiler will complain abou
Golangに入門して詰まったこと【備忘録】 〜これからやりたいことを添えて〜
##自己紹介
SEです。趣味の範囲でGolangに入門したので環境構築から詰まった所を備忘録として忘れないようにしておくために投稿しました。
Qiita初投稿なので生暖かい目で見てください。
アウトプットとしてこれからどんどん投稿していきたいと思っています。##環境
Mac OS BigSur 11.3
go 1.16
VScode
M1 Macbook Air##早速、環境構築
公式サイトからダウンロード!!!https://golang.org/dl/
https://code.visualstudio.com/download
公式のやり方ページを参考にインストール
https://golang.org/doc/install
ついでに、vscodeも「vscode インストール」 と検索して流れでGoの拡張機能もインストール!!!
Golangのインストールを確認する。
~~~
$go version
go version go1.16rc1 darwin/arm64
$
~~~とプロンプトが帰って来ればOK!!!
まぁ、ここまで来ればインスト
vscode-go で Workspace ごとに Go のバージョンを使い分ける
[vscode-go](https://github.com/golang/vscode-go) を使って Workspace (フォルダ) ごとに Go のバージョンを使い分ける方法をご紹介します。
[goenv](https://github.com/syndbg/goenv) のようなツールを使用しなくても Go と vscode-go の機能だけで簡単に複数バージョンを使い分けることができます。※ こちらの記事に記載されている内容は [vscode-go v0.25.0](https://github.com/golang/vscode-go/releases/tag/v0.25.0) 時点の情報になります。
## Go をインストールする
Go がまだインストールされていない場合は[公式のインストールガイド](https://golang.org/doc/install)に従ってインストールしておきます。
https://golang.org/doc/install
今回は 2021 年 5 月現在最新の 1.16.4 をインストールしました。
“`conso
【Go】本日日付のJST00:00:00をUTC時刻で取得する
## 概要
日付のデータに関してデータベース上では、UTCで格納しているケースはけっこうあると思います。ただシステムは日本時間(JST)の世界で動いているので、例えばクエリで日付を絞り込むときにJSTの00:00:00から開始したいんだけど、DB上はUTCなのでその昨日日付の15:00:00からのデータが対象となります。
ということで、こういうケースの場合、どうやってGoで日付の実装をしていけば良いのかというのを紹介します。## 対応例
* 取得するデータを日本時間の本日日付という前提で、まずはJSTの本日日付の00:00:00を取得します。[Goでtime.Parseを使うときのタイムゾーンについて](https://blog.70-10.net/2018/07/31/go-time-parse/)を参考に、まずは日本時間で`time.Now()`を取得し時刻部分の切り捨てを行います。例えば日本時間の2021/5/14に実行した場合は`2021-05-14 00:00:00 +0900 Asia/Tokyo`と出力されます。“`go
jst := time.FixedZon
Mac初心者のGoインストール
Goを使ってみたいと思ったのだ。
# 環境
– MacBook Air (M1, 2020)
– macOS Big Sur 11.3.1
– zsh# 制約
M1 Macがネイティブサポートされた、go version 1.6以降を入れたい
# goenvのインストール
Homebrewでインストールしたら最新のGoはサポートされていないようだったので、公式のgitからインストールする。
基本は公式のインストール手順に従う。
https://github.com/syndbg/goenv/blob/master/INSTALL.md
goenvのclone
“`
% git clone https://github.com/syndbg/goenv.git ~/.goenv
“`環境変数の設定
“`
% echo ‘export GOENV_ROOT=”$HOME/.goenv”‘ >> ~/.zshrc
% echo ‘export PATH=”$GOENV_ROOT/bin:$PATH”‘ >> ~/.zshrc
% echo ‘eval “$(