Go関連のことを調べてみた2021年05月20日

Go関連のことを調べてみた2021年05月20日
目次

フロントエンド(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 main

import (
“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 main

import (
util “crossMsg/util”
)

func main() {
util.MessageBox(“title”, “test”)
}
“`

“`go:messagebox_darwin.go
package util

import (
“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 “$(

元記事を表示

Go 1.16用Makefile

[『改訂2版 みんなのGo言語』](https://www.amazon.co.jp/%E6%94%B9%E8%A8%822%E7%89%88-%E3%81%BF%E3%82%93%E3%81%AA%E3%81%AEGo%E8%A8%80%E8%AA%9E-%E6%9D%BE%E6%9C%A8-%E9%9B%85%E5%B9%B8/dp/4297107279)のMakefileがGo 1.16では動かなかったので、動くように書き換えました。

# フォルダ構成
`cmd/myapp/main.go`にメインアプリのソースコードが入っている。internalは内部でしか使わないパッケージ、pkgは外部から参照可能なパッケージ。

“`shell
myproj/
├── Makefile
├── README.md
├── go.mod
├── bin/
│   └── myapp(ビルド後に生成)
├── cmd/
│   └── myapp/
│   └── main.go
├── internal/
└── pkg/
“`

# Makefile

“`makefile

元記事を表示

本の新刊データをJSONで取得できるようにする。

# はじめに
 コミックやラノベの新刊データ取得で、JSON形式で無料で取得しようとするAPIが見つからなかったので、[ゲーム、アニメ、CD発売日一覧](https://calendar.gameiroiro.com/)というサイトからスクレイピングして、JSONで出力するようなプログラムを作る

# プログラム概要
[ゲーム、アニメ、CD発売日一覧](https://calendar.gameiroiro.com/)というサイトから、
新刊の発売日、名称、作者、画像が引っ張ってこれるので、これらのデータをJSONで出力するようにする
また、実行結果は標準出力するようにする。

# プログラム内容

“`go:calendarscriping.go
package main

import (
“fmt”
“strings”

“github.com/PuerkitoBio/goquery”
)

type BookList struct {
Type string `json:type`
Months string `json:months`
Days stri

元記事を表示

【祝!初投稿】LINEbotを利用し、GO言語で書いたプログラムから自分のLINEアカウントにメッセージ送信してみた

## はじめに
はじめまして。初めて投稿します。

何を投稿するか悩んだのですが、少し前からLINEbotを触っていて、色々試していたら
「LINEbotにHTTPリクエストを送ったら、オウム返しで自分のLINEアカウントにメッセージを送れる。」
のがちょっと面白かったので、この内容にしてみました。

## LINEbotについて
– LINEが提供するボットサービスです
– LINEアカウントをお持ちでしたら、[LINE Developers](https://developers.line.biz/ja/)から作成できますので、
興味ある方は色々試してみてください

## LINEbotを使用するための準備
1. LINEbot用のチャネルを作成(手順は[こちら](https://developers.line.biz/ja/docs/messaging-api/getting-started/))
2. LINEbot作成(手順は[こちら](https://developers.line.biz/ja/docs/messaging-api/building-bot/))

元記事を表示

fireworqのメトリクスを収集する方法について考えた

こんにちは。qudoを打倒している者です。

https://qiita.com/stk0724/items/269328262d5a1f0eaa28

以前上記の記事を書いたんですが、最近fireworqをサービスインしていくつかのqudoジョブをリプレイスしました。

動作は問題ないんですが、滞留してるジョブの数など、各種メトリクスがとれていない状態なので、今回はそれらのメトリクスをモニタリングする方法を考えます。

## mackerelを利用する

mackerelをモニタリングツールとして利用している場合、fireworq公式のmackerel-agent-pluginが存在するため、それを利用するだけで済みます。(fireworqははてな社が開発しているOSSです)

https://github.com/fireworq/mackerel-plugin-fireworq

## cloudwatch + telegrafを利用する

cloudwatchにメトリクスを保管する場合を考えます。

弊社はお金ないのでこちらです。

### メトリクスの収集パート

メトリク

元記事を表示

GO言語基礎②(defer/map/range/Interface/goroutine/channel)

# 前回の記事
[GO言語基礎①(package/function/for/if/switch/struct/point/arrays/slice)](https://qiita.com/kenRp01/items/68e5c59dfafbb777d8dd)
# 基礎文法

## Defer:遅延実行
`defer`へ渡した関数の実行を呼び出し元の関数の終わり(returnする)まで遅延させる。`Finally`のようなもの。
`defer`が複数ある場合、渡した順にスタックされていき、最後から順に実行されていきます。
defer内での処理でエラーが発生した場合、エラーハンドリングのreturnは無視されます。
対策は以下記事を参考にしてください。
[【Go】 deferに渡した関数内のエラーを呼び出し元に返す](https://qiita.com/vengavengavnega/items/fd0782c30574a983b8a5)

“` :宣言方法
defer <処理>
“`
下記の順で`defer`に処理が渡されていた場合

“`go
defer func() {

元記事を表示

OTHERカテゴリの最新記事