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

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

アナ雪のメロディーに合わせた Golang の歌 – Write in Go – が最高すぎる

[Write in Go – YouTube](https://youtu.be/yhC-361QGJw)

> The schedule’s tight on the cluster tonight
> So I parallelized my code
> All these threads and continuations
> My head’s going to explode
> And all this bolierplate
> This FactoryBuilderAdapterDelegatelmpl…
> Seems unjustified
> Give me something simple
> Don’t write in Scheme
> Don’t write in C
> No more pointers
> That I forgot to `free()`
> Java’s verbose
> Python’s too slow
> It’s time to know
> Write in Go!
> Write in Go!
> No inh

元記事を表示

Node.js が Go より 2 倍も速いなんてことがあるのだろうか

こんにちはフロントエンドエンジニアをしている ku6ryo です。
普段は VR のスタートアップにて JavaScript で SPA を開発しています。
WASM に興味をもち、 WASM x Go は本当に早いのかという疑問から速度検証をしてみたのですが、WASM に辿り着く前に Go が JavaScript (Node.js) よりも遅いケースがあるのを発見したので共有および、なぜこうなるのかわかる方がいらっしゃればご意見をいただきたく、本記事を投稿します。

# 結果
先に結果から。10^7 以下の最大の素数を求めたところ、JavaScript (Node.js) 約 1200 ms に対して Go は 約 2500 ms となった。Node.js は Go よりも約2倍も速い結果となった(10回施行のばらつきは 数% 以内なので Node.js は Go に対して優位な差があるとみなせると判断)。なお、実行環境は `macOS Catalina / 2.3 GHz Dual-Core Intel Core i5 / 16 GB 2133 MHz LPDDR3` です。

元記事を表示

Go言語でFizzBuzzを書いてみた

# はじめに

正月休み時間があったので Go 言語を勉強しました。
基本文法の確認のため FizzBuzz を書いてみたら Go 言語ならではの面白い書き方ができるなー、と思ったので投稿することにしました。

## FizzBuzz のルール

* `1` から `100` まで数字を出力する
* その数字が `3` で割り切れるなら `Fizz` と出力する
* その数字が `5` で割り切れるなら `Buzz` と出力する
* その数字が `3` でも `5` でも割り切れるなら `FizzBuzz` と出力する

# コード

https://play.golang.org/p/CcpxL6bDT2c

“`golang

type FizzBuzzInt int

func (i FizzBuzzInt) String() string {
switch {
case i%15 == 0:
return “FizzBuzz”
case i%3 == 0:
return “Fizz”
case i%5 == 0:
return “Buzz”
defau

元記事を表示

golang 関数(func)の引数や戻り値で関数を指定したときの動作

# はじめに
golang を使い始めたのですが、関数の使い方で躓いたのでメモを残そうと思います。
関数の引数や戻り値に変数(int、string等)を指定した場合の挙動は想像できるのですが、 引数や戻り値に `func(int)` のような関数を指定をしたときの動きが直ぐにわからず、、動作を確認しました。

#### 確認パターン

– 引数に関数
– 戻り値に関数

# 引数に関数(1)
簡単な足し算をする処理です。 関数 `calc` の第1引数を `func(int, int)` とし、関数を受け取れるようにしています。
どの順番で実行されたかを確認するために `println` を入れています。

“`golang
package main

import (
“fmt”
)

func calc(fn func(int, int) int, x int, y int) (res int) {
fmt.Println(“(A)”)
res = fn(x, y) // 関数:add を実行
return
}

func add(x int, y int) int

元記事を表示

Go言語の基本Tips

プロジェクトによって色々な言語を使うことが増えてくると、パッと切り替えられず混乱してしまうことがあります。そんな自分用の備忘録です。

Go言語のプレイグラウンドは[こちら。](https://play.golang.org/)

# 特徴
* コンパイル言語であるため、Pythonなどの動的言語に比べ実行速度が圧倒的に速い。
* Goのプログラムが起動した直後には「main」パッケージに属する「main関数」が実行されるため、必ず「main関数」が必要。

# 処理の書き方
処理の最後に`;`は不要です。

“`Go
println(“hoge”)
“`

# 変数
`var`で定義し、データ型が変数名の後ろになります。
Goでは、データ型の指定を省略することが可能です。
次の3行は全て同じ意味になります。

“`Go
var a int = 1
var a = 1
a := 1
“`
#メソッド名や変数名の大文字/小文字
名前(トップレベルの型名、関数名、メソッド名、定数名、変数名、構造体のフィールドおよびメソッド名)の先頭一文字が大文字になっていれば、パッケージの利用者側

元記事を表示

Goでzstd形式のディレクトリ圧縮をやってみた

# やりたいこと
Goでzstdを用いたディレクトリ圧縮をしたい。

# zstdとは

http://facebook.github.io/zstd/

facebookがOSS化した圧縮アルゴリズム。
他の圧縮アルゴリズムよりも圧縮展開速度・圧縮効率に優れている。らしい。

# Goで使えんの?

ラッパーライブラリがありました。

リポジトリ: https://github.com/DataDog/zstd

godoc: https://godoc.org/github.com/DataDog/zstd

今回は上記を使用しますが、これ以外にもあるみたいです。

# 使ってみました

### サンプルリポジトリ

https://github.com/Raita876/zstd-sample

tar, zstdパッケージを使用してsampleディレクトリをアーカイブ、圧縮しています。

### ディレクトリ構成

“`
$ tree .
.
├── Makefile
├── README.md
├── go.mod
├── go.sum
├── main.go
└── sa

元記事を表示

GitHub GraphQL API v4を使ってリポジトリごとのContributionを集計してみた

## はじめに

2019年はKubernetes公式ドキュメントの翻訳をはじめ、OSS活動を積極的に行った年となりました。2019年の振り返りをはてなブログに書いた[^1]のですが、何かうまくいっていない気がしました。一因として、GitHubでのContributionを数えることに気をとられてしまったことが挙げられます。そこで、今後も振り返りを続けていくためにも簡単にContributionを集計したいところです。

GitHub GraphQL API v4[^2]を使うとよさそうだと知り、GUI[^3]でごにょごにょしました。概ね望んでいたデータはとれたのですが、データ構造をいじりたかったのでGraphQLのレスポンスをmarkdownに変換するツール[^4]を自作しました。

## GraphQL

以下の通りです。2行目と3行目のパラメーターを修正して使ってください。

“`graphql
{
user(login: “oke-py”) {
contributionsCollection(from: “2019-01-01T00:00:00.000Z”, to

元記事を表示

Go言語においてstruct定義をすることなくJSONを扱うときのTips

go言語においてJSONをあつかう際には、構造体を定義してmappingするのが一般的です。
ほとんどの場合この方法で良いのですが、たまにStructを定義したくない、できない状況があるかもしれません。
struct定義することなくJSONを扱う方法について記載していきます。

jsonを楽に使うパッケージ:[github.com/aimof/jaason](https://github.com/aimof/jaason)を作っている時に得た知見をまとめました。

## はじめに:`json.Unmarshal()`の基本

JSONをjson.Unmarshal()でunmarshalした際には、以下の型になります。

“`
bool, for JSON booleans
float64, for JSON numbers
string, for JSON strings
[]interface{}, for JSON arrays
map[string]interface{}, for JSON objects
nil for JSON null
“`

ご存知の通り、JSON

元記事を表示

gqlgen + Prisma Lift + gormで出勤管理を作ってみた

# サンプル
https://github.com/inadati/sample01-AttendManager.services

# コンテナ構成

### DB
– PostgreSQL

### cron処理
– busybox

### cronで叩く用graphql api(非公開api)
– gqlgen
– gorm

### 公開用graphql api
– gqlgen
– Prisma(Liftのみ使用)
– gorm

### クライアントアプリ
– nuxt
– Apollo Client

### その他
本番公開にhttps-portalを使用(別コンテナ)

# graphQLサーバーを立てる上での躓きポイントをまとめる
※下記は今後、別記事にしてリンクを貼るようにします。

### Hasuraによって作れるapiはいかなる場合もweb公開するしかないという話
PrismaはORMを使い、内部的にSQLを叩くことでDBを読み書きしているので
Prismaが自動生成するapiを直接、web公開する以外にも
prismaのORMを使い、別途公開用のgra

元記事を表示

Go + Echo + Vue.js + GORMで、DB接続する最低限のSPAを実装してみる

Go言語でのSPA開発について、一番基本的なところの実装を押さえておきたかったところに、素晴らしく簡潔にまとまった以下の記事を参考にさせていただきました。

Go + Echo + Vue.js SPAへの第一歩
https://qiita.com/K-juju/items/f6d0eedb9aee5714cb73

少しだけ実装を追加してみたので、そのご紹介です。

なおこのサンプルアプリケーションの基本的な機能については、この記事では説明しませんので、上記の@K-jujuさんの記事を参照ください。

# 追加でやってみた点
1. データをDBに保持し、ORMでデータ作成や取得を行うようにしました。
– DBMSには、とても気軽に使えるSQLiteを使いました。
– ORMには、シンプルながら高機能なGORMを使いました。
– GORMガイド
http://gorm.io/ja_JP/docs/index.html
2. 依存モジュール管理にModulesを使うようにしました。
– (参考)Go言語の依存モジュール管理ツール

元記事を表示

【Docker-Compose/Go/MySQL】Go、MySQL環境をdocker-composeで構築する

## 環境
– Go 1.13
– MySQL 5.7
– docker-compose 3

## docker-composeファイル
完成した`docker-compose`ファイルが下記になります。

“`yaml

version: ‘3’
services:
backend:
build:
context: .
dockerfile: “Dockerfile.dev”
volumes:
– ./:/go/src/github.com/test/go-src
ports:
– “8080:8080”
depends_on:
– db
environment:
– DATABASE_HOST=db
– DATABASE_PASSWORD=hogehoge
– DATABASE=dev
– DATABASE_USERNAME=root
tty: true
stdin_open: true

db:
i

元記事を表示

cweill/gotestsでtestifyを利用する

## 動機

プロダクトコードから[TableDrivenTests](https://github.com/golang/go/wiki/TableDrivenTests)に基づいたテストコードを生成してくれる [cweill/gotests](https://github.com/cweill/gotests)では値の比較はreflect.DeepEqualを用いている. testifyを利用することができるようになったようなので試す.([PR#109](https://github.com/cweill/gotests/pull/109))

## 手順

### CLI

“`bash
# reflect.DeepEqual
$ gotests -w -only Hello hello.go -exported hello_test.go

# stretchr/testify/assert
$ gotests -w -template testify -only Hello hello.go -exported hello_test.go
“`

### エディタ

VS

元記事を表示

各種 Web Application Framework メモリ使用量比較調査 (Go, Ruby, Python, Node.js, Java)

## 概要

– 「Hello World な HTML を返す程度の Web アプリケーション」または「それぞれの公式ドキュメントに載っているチュートリアルの初期状態に近いもの」を作成してメモリ使用量を比較する
– Web アプリケーションサーバは現時点でよく使われていると思われるものを使用する
– テンプレートエンジンはフレームワークのデフォルト設定またはフレームワークが推奨しているものを使用する
– macOS Catalina 上でメモリ使用量を計測
– メモリ使用量の計測には ps コマンドの RSS 値を使う (複数のプロセスを使うものはRSS値を単純に足したものをメモリ使用量とした。メモリ共有部分については考慮していないため、もう少しメモリ使用量が少ないかもしれない)

## 調査結果

メモリ使用量が少ない順に並べる。

– 7MB: Go 1.13 + Gin 1.5
– 10MB: Go 1.13 + Revel 0.21
– 24MB: Ruby 2.7 + Sinatra 2.0 + Puma 4.3
– 40MB: Python 3.8 + Flask 1.1

元記事を表示

Golang での Web アプリ開発で、理解を早める 5 ステップ

## Web アプリとは?
知っていると思いますが、共通認識に違いがないか確認するために書いています。
以下、[「Go プログラミング 実践入門」(英題: Go Web Programming)](https://www.amazon.co.jp/dp/B06XKPNVWV) から抜粋です。
> 1. HTTP を介し、HTTP リクエストメッセージの形でクライアントから入力を受け取る
> 2. HTTP リクエストメッセージを処理し、必要な処理を行う
> 3. HTML を生成し、HTTP レスポンスメッセージに入れて返す

## Golang での Web アプリ作成に必要な項目
ざっくりと、以下が Golang で Web アプリ開発をする際に実施する項目になります。

– マルチプレクサ (multiplexer) を作成
– 例: `mux := http.NewServeMux()`
– 注意: `sync.Mutex` とは全く別だよ!(自分自身、勘違いしてたので。。)
– Handle (ハンドラ)、またはハンドラ関数を作成
– ルーティング設定

元記事を表示

Docker コンテナ内で立ち上げた godoc にホスト側からアクセスできなかった

## この記事について

Go言語の勉強用の環境として立ち上げた Docker コンテナ内で godoc サーバを立ち上げたが、ホストOS側のブラウザからアクセスできなかったので調べてみたメモ。

**環境**

* Windows10 Pro Insider Preview (バージョン: 2004, OSビルド: 19536.1000)
* WSL2 / Ubuntu-18.04 ( [.wslconfig で localhost フォワーディング設定済み](https://qiita.com/snaka/items/a8eee4cfc8f7d733e6ab) )
* Docker
* 2.1.7.0(41536)
* Engine 19.03.5

**用意した Dockerfile**

“`Dockerfile:Dockerfile
FROM golang:latest

RUN mkdir /go/src/app
WORKDIR /go/src/app
RUN go get golang.org/x/tools/cmd/godoc
EXPOSE 6060/

元記事を表示

Go1.13とDockerで開発環境構築(ホットリロード有)

# はじめに(背景)
筆者は今までGoでは簡単なツール(Slack用Botとか)しか作ってこなかったが、
Goを使ってWEBアプリを開発してみることにした。 

ところが、開発環境を構築するのに、検索でヒットする情報が微妙だった
– Goのバージョンが古くてGo Modulesを使っていなかったり、
– 使っているライブラリの最終更新が3年前だったり

情報を整理しながら開発環境を構築する必要が有ったので、
せっかくだからアウトプットしておこうと思った。

# 前提
– Goのversionは、執筆時点で最新の1.13系を使う
– docker-composeで立ち上げたい
– せっかくなので、ホットリロードが欲しい

### 以下には触れません
– GoでのWEBサーバーの立ち上げ方
– Go Modulesについて
– Docker、docker-composeの使い方

# 本題
## Goの設定
#### Go Modulesを使う
Go Modulesの導入や使い方などは割愛
↓のコマンドでinitialize
`go mod init github.com/username

元記事を表示

database/sql で INSERT したレコードのIDを取得する

# 概要

Go の `database/sql` を利用して、 INSERT したレコードのIDを取得する

## 参考

– [Inserting records into a PostgreSQL database with Go’s database/sql package](https://www.calhoun.io/inserting-records-into-a-postgresql-database-with-gos-database-sql-package/)

## 問題

– 使用しようとした `lib/pq` では `LastInsertId() (int64, error)` が使えない
– `database/sql` は `int64` で ID を返す Interface しか存在しない

### 使用しようとした `lib/pq` では `LastInsertId() (int64, error)` が使えない

`database/sql` では import する [Driver](https://github.com/golang/go/wik

元記事を表示

Echo+GORMでRESTfulなAPIサーバをつくる

# Overview
小規模なプロダクトにおいてPythonでAPIサーバはしんどい(できるけどソースが美しくない)ので, 全然使ったことないけどGoでAPIサーバを立ててみたい

# Description
普段お仕事では[Django REST Framework](https://www.django-rest-framework.org/), 趣味では[Flask](https://a2c.bitbucket.io/flask/)を使っているんですが, PythonでORマッパー使おうとすると[SQLAlchemy](https://www.sqlalchemy.org/)とか使うハメになってしんどいです.

かといってDjangoを使うのはウェイトが重い…
peeweeとかいういい感じのライブラリもあるっぽいですが

ということでせっかくなのでGoで作ってみます

今回は, 要素を一意に特定できる`id`と文字列`text`を要素に持つPostを定義して, API経由でCRUD操作を行うようなアプリを作ります

元記事を表示

Goのsqlmockを使ってみた

sqlmockを使ってみた。コードは[こちら](https://github.com/reikkk/dbmock)になります。

元記事を表示

Go で ipc package を書いてみた

あけましておめでとうございます。

昨年の末ごろから、なんとなーくプロセス間のソケット受け渡しを Go でやってみたいなーと思って少しずつコードを書いていたんですが、年末年始の時間を使って書き上げたので、ここで報告します。

軽い気持ちで書き始めたものの、なかなかハマることが多くて結構な時間がかかってしまいました。。。

成果物
========================================

https://github.com/navel3/go-ipc
https://godoc.org/github.com/navel3/go-ipc

Motivation
========================================

– TCP接続をプロセス間で授受することで、コネクションレスなリバースプロキシ的なものができるのではないかと思った
– Go だけで低レイヤーのコードを書いてみたかった
– テストからドキュメントまで Go Way に従って書く題材が欲しかった

実装
==================================

元記事を表示

OTHERカテゴリの最新記事