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

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

【Go言語】FirebaseAuthのユーザーを全て削除する

# 概要

FirebaseAuthを検証で使ってたら `example1@example.org` みたいなユーザーが大量に増えてしまったので一括で削除を行いたいが、Firebaseのコンソールからは出来ないみたいだったので Firebase Admin SDK で一括削除を行うことにした。該当記事が見つけられなかったので自分用メモも兼ねて記事を書いた。

今回は Go 言語で削除処理を書いたが、下記の言語も対応している模様。

– Node.js
– Java
– Python
– C#

参考: [サーバーに Firebase Admin SDK を追加する](https://firebase.google.com/docs/admin/setup?hl=ja#next_steps)

# 前準備

1. `go get firebase.google.com/go` で Firebase Admin SDK を導入
2. Firebaseコンソールからサービスアカウントキーを取得する

サービス アカウント用の秘密鍵ファイルを生成するには:

“`
1. Firebase

元記事を表示

Go言語 + GVM + GoModules + GoLandを利用する際の初期設定

# 概要

Go言語でパッケージ管理をGo Modules、IDEでJetBrains製のGoLandを利用する際の初期設定についての自分用メモ。1年前(2019年春)から始めた構成なのでもしかしたらもう古いかもしれない。

gvmはすでにインストール済みとする。

# GoModuleの有効化

Goバージョンは1.12以上ならなんでも良い(はず)。

1. `gvm use go1.12` で Go 言語のバージョンを指定
2. `export GO111MODULE=on ` で Go Modules 有効化 (.zshrcとかに書いとくと良い)
3. `git init` で git 管理対象にすることで、`go mod` にモジュール名を認識させる
4. `go mod init` で Go Modules の初期化

# GoLandの設定

1. GoLand 2018.3.4 以上をインストール
2. Preferences を開いて、Go > Go Modules(vgo) を有効化する。(下記画像の通り)
3. [vgo integration support |

元記事を表示

Goでスプレッドシート情報を取得する

# 背景

こんにちは、@harhogefooです。

Google Apps Scriptを使ってスプレッドシートの情報を取得して何かやりたいことはあると思います。
ただ、GASを使うと並行処理が書けません。
なので、複数のスプレッドシートを参照して何かしたい場合、実行時処理時間がかかってしまいます。

そこで、今回はGolangのgroutineを使って、スプレッドシート情報を並行に取得する方法をまとめました。

## サービスアカウントを利用してスプレッドシート情報にアクセスする
前提知識を得ておくために公式ドキュメントのQuickstartを読んでおくことがおすすめです。
https://developers.google.com/sheets/api/quickstart/go
上記リンクに書いてある内容をまとめると

– Google APIsのSpreadsheet APIを有効化し、OAuthクライアントIDを発行
– このIDを利用してプログラムからスプレッドシートにアクセス
– プログラム実行時にブラウザが立ち上がりGoogleアカウントログインを求められ、ログイン

元記事を表示

SQSメッセージ受信時に送信時刻を含めて取得する

SQSからメッセージ受信時に送信時刻も含めて取得するサンプルです

### デフォルト(送信時刻は含まれない)

“`golang:main.go
package main

import (
“fmt”

“github.com/aws/aws-sdk-go/aws”
“github.com/aws/aws-sdk-go/aws/session”
“github.com/aws/aws-sdk-go/service/sqs”

“os”
)

func main() {
session := session.Must(session.NewSession(&aws.Config{Region: aws.String(“ap-northeast-1”)}))
sqsSvc := sqs.New(session)
queueURL := aws.String(os.Getenv(“SQS_URL”))
params := &sqs.ReceiveMessageInput{
QueueUrl: queueURL,
MaxNumberOfMe

元記事を表示

Go でリフレクションを使って struct をバリデーションする

Go 言語で、テストに必要な Variables がちゃんとセットされているか確認したいという要望があった。その Variables もいろんなところに分散していたら面倒なので、一か所で書きたかった。つまりこんなイメージ。

“`go
type Foo struct {
Bar string `env:”TF_VAR_hello”`
Baz string `env:”TF_VAR_world”`
}
“`
こんな感じで構造体を書いておくと、自動で、`TF_VAR_hello` と `TF_VAR_world` の環境変数を読み込んで、それをそれぞれのフィールドにセットしてほしい、そしてすべてのフィールドがちゃんとなんかしらの値がセットされていてほしい。

このような要件の時はリフレクションだけど、Goではやったことなかったので調べて試してみた。

# フィールドの読み込み

定義されたすべてのフィールドの読み込みは次のコードで可能になる。ちなみに、`s` は、ポインターでも実体でも良い。

“`go
func validate(s interface{}) {
val :=

元記事を表示

【Golang】Module環境で相対パスmoduleとpackageをimport (Go:1.13)

ちょっとハマったので自分用メモ。
Go Modules環境でローカルに配置した共有moduleと、子packageを使う場合の指定の仕方。

# TL;DR
別moduleならgo.modに`replace`で相対パスを記載する。
同一moduleなら`import 自module名/ディレクトリ名`で指定する。

# フォルダ構成
“`
project_root
├── module_a
│ ├── go.mod
│ └── main.go … ここで common_module/common を使いたい

├── module_b
│ ├── go.mod
│ ├── main.go … ここで common_module/common と sub_package を使いたい
│ └── sub_package
│ └── sub.go

└── common_module
├── go.mod
└── common.go
“`

# ソースコード

元記事を表示

Goが他の言語と違ったところ

# まえがき
風邪をひいて会社を休んだので、この機会に前から気になっていたGoを勉強しようと思い、以下のサイトで勉強を始めた。
https://golang.org/doc/

学んでいくうちに、これは他の言語にはなかった機能だなと思ったものを書いていく。
「他の言語にはなかった機能」とは、私にとって初めて目にする機能である。以下のプログラミング言語はだいたい分かるはずなので、これらの言語には無い機能なはず。
`Pascal, C, Java, Perl, Python, TypeScript`
他の言語には同じような機能があるのかもしれないが、容赦して欲しい。

# スライスのcapacity
配列は、C言語と同じく固定長である。以下では、長さ6のint配列を定義をする。

“`go
arrayedPrimes := [6]int{2, 3, 5, 7, 11, 13}
“`

配列は固定長で使い勝手が悪いので、以下のようにスライスが多用される。

“`go
slicedPrimes := []int{2, 3, 5, 7, 11, 13}
“`

スライスにはlengthと

元記事を表示

error messageにコロンをつけたらlintに怒られた

Goを書いている時に怒られて何のことかわからなかったので、調べた覚書です。

# 起こったこと
“`
errors.New(“Not found.”)
“`
サンプルの記述ですが、上記の記述だと、下記のメッセージが出て記述を直すように言われます。

“`
error strings should not be capitalized or end with punctuation or a newline
“`
エラーの文字列は大文字にしたり、句点、改行で終わらせたらいけないらしいです。
なぜ、そんな事になっているのか気になったので、公式のwikiで調べました。

> Error strings should not be capitalized (unless beginning with proper nouns or acronyms) or end with punctuation, since they are usually printed following other context.

https://github.com/golang/go/wiki/Co

元記事を表示

fluentbitを使ってk8s上のGoアプリケーションのログやカスタムメトリクスを回収する

# この記事でやること

この記事では、fluentbitを用いてk8s上のアプリケーションのログを回収してElasticSearchに送る方法をまとめます。またログの中にカスタムメトリクスを出力して、それをKibanaで可視化も行います。

具体的にはGoアプリに以下のようなログを吐き出させるようにして

“`json
{“count”:0,”file”:”main.go:16″,”func”:”main.main”,”level”:”info”,”msg”:”sample log”,”text_sample”:”fooooo”,”time”:”2020-03-02T18:22:24+09:00″}
“`

Kibanaでちゃんとメトリクスとして扱えるように送信します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129577/192d94d0-be0e-aa7e-718c-3e9dd3edd456.png)

# fluentbitとは

![https://www.tre

元記事を表示

ゴリラに喋らせるコマンドを作った

こんにちは、ゴリラです。

みなさん`cowsay`ってコマンド知っていますか?
牛を喋らせることができるコマンドですが、それのゴリラ版が欲しくて作ってみました

https://github.com/skanehira/gorillasay

![](https://camo.githubusercontent.com/99f06e7e79533e127ad59a9f3be6a9fa4fa795d5/68747470733a2f2f696d6775722e636f6d2f5a70776235756a2e706e67)

## 使い方
`gorillasay`に引数を渡すだけです。
スペースで改行されるので、改行したくない場合は`”`で囲ってあげてください。

## 使いみち
ぱっと思いつかないのですが、`CI`とかに組み込むと楽しいかなと思います。

元記事を表示

embeded使い方【golang】

# embeded
– golangで継承のようなことをしたいときに使うembeded
– イマイチ理解できなかったのでまとめました。
– Javaなどのオブジェクト指向言語の継承と同じ使い方をすると`スーパークラスとして初期化する際のエラー`や`オーバーライドできない`などの問題が発生する
– ※キャプチャと本記事のコードとで初期化時の値が異なることがありますが本質的なところは変わらないのでご了承ください。

# embededの例
– まずは構造体に何らかのメソッドを持たせる
– Employees(従業員)とBoss(上司)にしてみる

“`go:main.go
type Employees struct {
name string
}

func newEmployees(n string) *Employees {
e := new(Employees)
e.name = n
return e
}

func (e *Employees) Hello() string {
return “名前:” + e.name // >>
}

元記事を表示

golintのcliの実装を読んでみる

Goでのプログラミングに欠かせない静的解析ツールgolintのソースコードリーディングをしてみました

リポジトリ: https://github.com/golang/lint
(2020/3/1 時点)

# ディレクトリ構成
“`
.
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── go.mod
├── go.sum
├── golint
│   ├── golint.go
│   ├── import.go
│   └── importcomment.go
├── lint.go
├── lint_test.go
├── misc/
└── testdata/
“`

パッケージが、ルートディレクトリ直下の**lint**パッケージとgolint/以下の**main**パッケージの2つに分かれています

– lint.go
静的解析のロジックはここに書かれています

– golint/golint.go
cliツールの実装が書かれています

– golint/import.go
golint.goで使う補助関数が書かれてい

元記事を表示

データ分析基盤構築入門 サンプルアプリエラー

[データ分析基盤構築入門](https://amzn.to/2TaD1oC)のサンプルアプリケーションを、Dockerで立ち上げる際にエラーが出て、うまく立ち上がらなかったので、色々ソリューションを試しました。

その中で、2020/3/1現在のソリューションを書きます。

## エラー内容

“`shell
$ docker-compose up –build
“`

dockerでelasticsearch fluentd goアプリケーションを立ち上げると、fluentdコンテナの立ち上げでエラーが出ます。

## ソリューション
### 1.fluentdのtd-agent-gemのバージョンをあげる。

`blog-sample/Dockerfile-fluentd`の中身を以下のように変更します。

“`
FROM debian:jessie

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get -qq update && apt-get install –no-install-recommends -y curl c

元記事を表示

Kotlin vs Go 処理時間を比較してみる

#1. はじめ
最近はどこもかしこもGoばっかり!
SE(笑)で化石のようなJavaを扱った経験を持つ人間としてはKotlinの方がしっくりくるのですが、なんだか肩身が狭いです。

そこで今回はGoとKotlinで同じようなコードを書いてみて処理時間という点でどれだけ差があるか実験してみました。

#2. 内容
・Kotlinはコンパイラでjarにした後、Amazon Corretto8のランタイムで動かす
・Goは公式でリリースされてる最新のものを使用(Go 1.14)

##1回目
・10万の要素を持つ配列に乱数で値をひたすら入れてみる
・とりあえずこれだけ

“`main.kt
import kotlin.random.Random

fun main(args: Array) {

val startTime = System.currentTimeMillis()

var listData: Array = Array(100000){it}
for (i in listData) {
listData[i

元記事を表示

Open状態のファイルに対して、Linuxだとos.Renameに成功するが、Windowsだとエラーになる

# 環境情報

この記事は以下の環境で稼働確認を実施しました。

– Windows
– Microsoft Windows [Version 10.0.19041.84]
– go version go1.13.5 windows/amd64
– Linux
– Ubuntu 18.04 LTS (Bionic Beaver)
– go version go1.13.8 linux/amd64

# 事象

Open状態のファイルに対して、`os.Rename`を呼び出すと、LinuxとWindowsでは結果が異なります。具体的にはLinuxでは`os.Rename`に成功しますが、Windowsではエラーになります。

以下はOpen状態のファイルに対して、`os.Rename`を利用するコマンドです。

“`go:main.go
package main

import “os”

func main() {
fp, err := os.Open(“old.txt”)
if err != nil {
panic(err)
}
defe

元記事を表示

GAE/Go(2nd Gen)でDatastoreモードのFirestoreとFirestoreを使う

# GAE/Goでのデータストア
GAE/GoでのデータストアはCloudSQLか、DatastoreモードのFirestore、Firestore、その他外部サービスを利用する方法が考えられます。(以前は、GAEのAPIにDatastoreがあったのですが、今は、[DatastoreモードのFirestoreを使う](https://cloud.google.com/appengine/docs/standard/go/using-cloud-datastore?hl=ja)ことになっているようです。)この記事では、DatastoreモードのFirestoreを使う方法と、Firestoreを使う方法をまとめておきます。

## 本題に入る前の注意点
DatastoreモードのFirestoreを使うか、Firestoreを使うかは、GCPのプロジェクトでDatastoreを選択した時点で固定されてしまいますので注意してください。(興味本位でやっちゃうと、プロジェクトごと削除するしかなくなってしまう…)

## DatastoreモードのFirestoreを使う。
Datastore

元記事を表示

[Golang] sliceの重複処理を行う、array_unique関数みたいなものを作ってみた (解説付)

# はじめに

Go言語の標準に、PHPでいうところの、`array_unique`みたいな関数が見当たらず、関数にしてみたので共有します。
とはいえ、定番のmap式の重複処理を関数にしただけですが…笑

初学者向けにしっかりめに解説してますので、ツッコミあれば、ぜひコメント欄に書いて頂けると嬉しいです!

# 今日のコード

## コピぺでそのまま使えるコード全文

“`golang
package main
import “fmt”

func main(){
target := []string{“あ”, “い”, “う”, “あ”}

unique := sliceUnique(target)

fmt.Println(unique) // -> [あ い う]
}

func sliceUnique(target []string) (unique []string) {
m := map[string]bool{}

for _, v := range target {
if !m[v] {

元記事を表示

[Golang]slice内で特定の要素があるか調べる、contains関数を作ってみた(解説付)

# はじめに

Golangの標準パッケージで、PHPやJavaScriptでいうところの`contain`関数のようなものがなかったので、作ってみました。
気軽にコピペして使って頂けると嬉しいです。

# 今回のコード

以下、今回共有したい本題です。

## コピペで使えるコード全文

“`golang
package main
import (
“fmt”
“reflect”
)

func main(){
list := []uint64{1, 2, 3} // ここに対象のスライスを入れる
target := uint64(3) // ここに対象の要素を入れる

result, err := contains(target, list)
fmt.Println(result, err) // -> true
}

func contains(target interface{}, list interface{}) (bool, error) {

switch list

元記事を表示

Goのnet/httpの実装をちょっと読んでみる

# はじめに

Goは標準パッケージとしてHTTPサーバが組み込まれており、`net/http` パッケージを用いると簡単にHTTPサーバを動かすことができます。今回は `net/http` パッケージの一部(HTTPサーバの内容)の実装を読むことで、HTTPサーバが動く裏側をざっと見てみたいと思います。困ったら [公式ドキュメント](https://golang.org/pkg/net/http/) を見ましょう。

なお、読んでいるコード Go1.13 のものです。

# Doc

まずざっと公式ドキュメントに書いてあるサンプルとドキュメントを眺めて、仕様をおさらいしておきます。

## `type Handler`

> ハンドラはHTTPリクエストに対してレスポンスを返します。
>
> ServeHTTPはレスポンスヘッダーとデータをResponseWriterに書き込んでからreturnする必要があります。リクエストが終了したことを示すシグナルを返します。ServeHTTP呼び出しの完了後または完了と同時にResponseWriterを使用したり、Request.Bodyを読

元記事を表示

Adafruit Trinket M0でTinyGo

#はじめに
Goで組み込み向けプログラミングができるTinyGoが盛り上がってきているようなので試してみた。
今回実行したのはAdafruit Trinket M0の搭載LEDを利用したLチカ。
#動作環境
* OS: macOS 10.15.3
* Go: 1.13.8
* TinyGo: 0.12.0
* マイコン: Adafruit Trinket M0

#セットアップ
###Go
“`
$ brew update
$ brew install go
“`
###TinyGo
“`
$ brew tap tinygo-org/tools
$ brew install tinygo
$ brew tap osx-cross/avr
$ brew install avr-gcc avrdude
$ go get -u tinygo.org/x/drivers
“`
###BOSSA
[BOSSA](https://github.com/shumatech/BOSSA/releases)からMAC用パッケージをダウンロードしてインストール
#実行コード
“`go:main.

元記事を表示

OTHERカテゴリの最新記事