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

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

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() {

元記事を表示

VSCodeでProject Managerを使っている場合にgoplsが動かない現象を解消する

# _VSCode_ で _Project Manager_ を使っている場合に _gopls_ が動かない現象を解消する

動作環境
– macOS: Catalina
– VSCode: 1.56.1
– gopls: v0.6.11
– GO: go1.16.3 darwin/amd64

## _Project Manager_ を使って開発スペースを立ち上げるとエラーが発生する

“` text
Error loading workspace: gopls requires a module at the root of your workspace.
You can work with multiple modules by opening each one as a workspace folder.
Improvements to this workflow will be coming soon, and you can learn more here:
https://github.com/golang/tools/blob/master/gopls/doc/wo

元記事を表示

AWS Cognitoでユーザー情報をAWS Lambda(Golang)から取得する方法

# 目的
APIを叩いてきたユーザー名によって変えたいということがありました。
そこで、Cognitoでオーソライズを行っているLambda関数にて、API Gatewayの認証情報をLambda(Golang)の中で取得する方法を調べました。

# 結論

以下のコードでユーザー名を取得できます。

“`go
func handler(ctx context.Context, apiGWEvent events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {

ユーザー名取得
diaryGetter := apiGWEvent.RequestContext.Authorizer[“claims”].(map[string]interface{})[“cognito:username”].(string)

/// …略
}
“`

割と途中のコードとかが謎ですので、以下に解説を載せておきます。(これより単純に取得できる方法がありましたらご教授いただけると幸いです。)

# 解説

元記事を表示

備忘録 Goでginを使う時に、cssやjsのファイルが読み込めない問題の解決

# 書いた理由
go言語でginを使っていたら、htmlからjsが読み込めない問題が発生したので、忘れないようにメモっておきます。また、ginを使わない場合でも同様の操作が必要らしいです。
cssの読み込みも同様にやるので、省略します。

## ディレクトリについて

[github](https://github.com/suzakutakumi/gin-staticJS)に今回のコードはおいてあります。
`correct.go`が正常に動作するプログラムで、`incorrect.go`が正常に動作しないプログラムです。

“`
./
├── correct.go
├── incorrect.go
└── src
├── index.html
└── js
└── main.js
“`

## htmlとjs

ボタンを押すと、alertで`Pushed!!`と出るだけの簡単なプログラムです。

“`html:index.html


gin-js