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

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

gqlgen httprouter recipe

###gqlgenとhttprouteの組み方

“`
import (
“net/http”

“github.com/99designs/gqlgen/graphql/handler”
“github.com/99designs/gqlgen/graphql/playground”
“github.com/julienschmidt/httprouter”
)

// Defining the Playground handler
func PlaygroundHandler() httprouter.Handle {
h := playground.Handler(“GraphQL”, “/query”)

return func(w http.ResponseWriter, req *http.Request, ps httprouter.Params) {
h.ServeHTTP(w, req)
}
}

// Defining the Graphql handler
func GraphqlHandler(

元記事を表示

【Go(gorilla)】チャットのサンプルアプリでWebSocketサーバの設計思想を理解しましょう。

こんにちは。
普段はネットワークの組込み系F/W開発をしています。個人的にWebSocketで高効率なソケットサーバ作れないかと思い、GorillaのWebSocketライブラリ内のサンプルコードから設計思想を拝借しました。

私が理解した内容を纏めてみました。Go言語勉強して約2日で知見の浅い記事になってると思います。
間違い等あればご指摘ください。

##趣旨
Go言語のWebSocketサーバの効率よい設計を理解する。

## 前提知識
– Go言語
プログラミング言語。

– Gorilla
WebSocketやHTTPなどのライブラリ。下記記事が分かりやすいです。
https://qiita.com/gold-kou/items/99507d33b8f8ddd96e3a

## 参考文献
[100万回のWebSocket接続とGo](https://postd.cc/100%E4%B8%87%E5%9B%9E%E3%81%AEwebsocket%E6%8E%A5%E7%B6%9A%E3%81%A8go/)
Go言語におけるWebSocketの設計記事。

[ゴルーチンとチャ

元記事を表示

1分でgolangでHello World を表示する。

# 環境
docker for windows
PowerShell

# コマンド

“`
>docker pull golang
>docker run –name golang -it golang /bin/bash
root@*******:/go# git clone https://github.com/go-training/helloworld.git
root@*******:/go# go run helloworld/main.go
Hello World!!
“`

# 備考
docker for windowsが入っていないと時間がかかります。

元記事を表示

GitHub Actionsでcacheに転んでいた

# はじめに
[前回の記事](https://qiita.com/yawn_yawn_yawn_/items/2f4bf5d3ce7e5e77dfd7#yaml%E5%85%A8%E4%BD%93)のまとめを読んでからだと、雰囲気がつかみやすいかも?

# 実現したかったこと
GitHub Actionsを用いてgoの静的解析、テスト/ビルドを行うCIを構築したい。
その際、毎回モジュールのインストールが挟まると時間がかかっちゃうので、キャッシュを使って短縮したい。という話の続き。

[前回の記事](https://qiita.com/yawn_yawn_yawn_/items/2f4bf5d3ce7e5e77dfd7#yaml%E5%85%A8%E4%BD%93)の段階では、キャッシュヒット、と通知されたが、`go vet`や`go test`を行う際にモジュールのインストールが発生する。保存したはずのキャッシュが使えてねえ…

# 起きていたこと

**中身がキャッシュされていなかった事件**

キャッシュ自体はされていましたが、モジュールがキャッシュされていませんでした。な

元記事を表示

よく使うGoのBuildオプションと、UPXの圧縮がバイナリサイズにどの程度影響しているか調べた

# はじめに

GoのBuildオプションでサイズに影響しそうなオプションで、どの程度サイズに差がでるか試しました。

以下の環境です。自分のよくあるGoのユースケースとしてWebAPI開発あるので、go-swaggerやAWS SDK Goに依存したプロジェクトで試してみました。

“`bash
$cat /etc/os-release | head -n2
NAME=”Ubuntu”
VERSION=”18.04.4 LTS (Bionic Beaver)”

$ go version
go version go1.14.2 linux/amd64
“`

# 比較

“`bash
# 1. ノーオプション
go build -o nooption main.go

# 2. ldflagsでdebug情報を削除
go build -ldflags=”-s -w” -o ldflags main.go

# 3. trimpathでパス情報を削除
go build -ldflags=”-s -w” -trimpath -o trimpath main.go
“`

* `

元記事を表示

Go言語のdeferを正しく理解する | How defer in Golang works

deferってなんかかっこいい!
くらいの認識の人向け。

# 環境
“`bash
go version go1.13.7 darwin/amd64
“`

# A Tour of Goより
> A defer statement defers the execution of a function until the surrounding function returns.

> The deferred call’s arguments are evaluated immediately, but the function call is not executed until the surrounding function returns.

> defer文は、上位ブロックの関数がreturnするまで関数の実行を遅延させる。
遅延実行される関数の引数は即時評価されるが、関数の実行は上位ブロックの関数がreturnするまで実行されない。

_出典: [A Tour of Go](https://tour.golang.org/flowcontrol/12)_

# 試してみ

元記事を表示

Golang – MySQL Scan Error

# Problem
“`
sql: Scan error on column index 5, name \”time\”: unsupported Scan, storing driver.Value type []uint8 into type *time.Time]”}
“`

# Solution
You need added string “parseTime=true” in mysql connection setting.

“`
db, err := sql.Open(“mysql”, “root:@/?parseTime=true”)
“`

https://stackoverflow.com/questions/29341590/how-to-parse-time-from-database/29343013#29343013
https://stackoverflow.com/questions/45040319/unsupported-scan-storing-driver-value-type-uint8-into-type-time-time

元記事を表示

GitHub Actionsのcacheでどハマりした

## はじめに
タイトルそのままのことがおこりました。

4/15追記: 今回ハマったこと自体は、原因がわかり、形的に成功しているように見えるのですが、8割解決してないです。
こちらも合わせてどうぞ…。
[GitHub Actionsでcacheに転んでいた](https://qiita.com/yawn_yawn_yawn_/items/3f1f796d6eb600447222)

## 実現したかったこと
CIにgoの静的解析とテスト、ビルドを盛り込むこと。
その過程で、毎回go moduleのインストールが挟まると時間がかかっちゃうので、キャッシュを用いることでで解決したい。

## ハマったこと
キャッシュの探索では、`Cache not found for input keys: …`となり、ごめん見つからんかったわーって言われる。

![スクリーンショット 2020-04-13 15.04.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261043/5abc4d2f-7a56

元記事を表示

WSL (ZSH)でGolang 環境を作ろうとしてハマりかけた罠

# ~~sammary~~ summary
WSL でGolang環境を作ろうとしたらgoenvインストール後ディレクトリ名がおかしくなっていました。

“` ~/.
.goenv~ (ファイル名)
etc…
“`

## やったこと
参考:https://qiita.com/10380r/items/37d0bf71b0e19a49ce53

* golang のバージョン管理ツールgoenvを入れる

“`
git clone https://github.com/syndbg/goenv.git ~/.goenv
“`

* 環境変数設定

“` ~/.zshrc
export GOENV_ROOT=$HOME/.goenv
export PATH=$GOENV_ROOT/bin:$PATH
eval “$(goenv init -)”
“`

この後 “`source .zshrc“`をしてもcommand not found: goenvになってしまうし
“`which goenv“`をしてもgoenv not foundになってしまうしで頭を抱え

元記事を表示

【Go言語】ポインタ変数を reflect パッケージで動的に操作する

Javaとかオブジェクト指向言語のリフレクションと同じ感覚で操作しようとすると結構ハマりますよね、golangのreflect。

特にポインタの場合、一味工夫が必要だったりするので、現場で使いそうな操作をまとめておきます。(これが更に “構造体の中のフィールド” だったりするとまた色々あるのですが、また後日にでも。)

“`go
package main

import (
“fmt”
“reflect”
“strconv”
)

func main() {
//stringを作成
s := “Aerith”
fmt.Println(“s=” + s) // s=Aerith

fmt.Println(“************* ポインタを reflect パッケージで色々いじくってみる ***********”)

//sのポインタを取得
ps := &s
fmt.Println(*ps) // Aerith

//ps のreflect.Value構造体を取得
psValue := reflect.ValueOf(ps)
fmt.Println(p

元記事を表示

golangで便利ツール作ろうと思ったらos/execでハマった話

# はじめに

PoCの初期段階などで、いくつかのシステムを組み合わせて動作させるような場面では、
リポジトリが分散し、開発者ごとに違う言語で小規模なシステムを構築していることがあります。

そんな中で、動作確認をしたり、不具合を再現させたりする際、以下のような手作業が発生していました。
1. システムAを実行してCSVを吐く
2. CSVをシステムB直下にコピーする
3. システムBを実行して結果を得る

プログラマーの三大美徳の怠惰担当の私は、手動で何かをすることが嫌いなので、自動化するツールを作成していきます。
シェルスクリプトで書いても良いのですが、実行するデータパターンが複雑だったり、分岐したりすると面倒なので、私はgolangで作成することが多いです。

この記事では、そんな中でハマった出来事と、回避方法をご紹介します。
根本解決していないものが多いので要注意&コメントお待ちしています。

# 先にまとめ

– 変なところでハマる場合は、最初からシェルスクリプトで書いたほうが早い
– os/execでの実行結果と、ターミナルで手で叩いたときの出力結果は異なることがある

#

元記事を表示

複数のgithubアカウントをノンストレスで運用する方法(脱ssh鍵設定)(git credential helperの活用)

# はじめに

githubは公式でも言っているように、基本的に1人1アカウントで運用することが推奨されています。
しかし、様々な事情で複数のGithub Accountを利用している人も多いのではないでしょうか。
そんな時に困るのが、git commandを使用する時の認証だと思います。

実際にググってみると、以下のような回避方法がありました。

1. ssh keyを登録して、ssh configを設定して切り分ける方法(一番王道)
2. 1つのリポジトリだけであれば、 `https://username:password@github.com/xxx/xxx` でcloneする方法(リポジトリ一つならこれが圧倒的に楽)
3. `.netrc` を切り替えて使う方法 (sshの設定しなくていいけど、手動切り替え)

しかし、sshの鍵登録するのもいやだし、すべてのremote設定を `git://` にするのも面倒。 `go mod` もノンストレスで動いて欲しいし、httpsでやりたいけど、毎回手動で切り替えもしたくないとずっと悩んでいました。

そこで少し調べてみると、 `g

元記事を表示

改行コードって難しいっ

## はじめに

標準入力から文字列をつけとってなんやかんやする機会は多いと思います。Go で標準入力から文字列を受け取る方法の 1 つとして [fmt.Scanf](https://golang.org/pkg/fmt/#Scanf) を使う方法があります。for ループを使った複数行の文字列を読み込んでいるときに Unix 系の OS と WindowsOS で挙動が異なることに気づきました。バグっぽい挙動を示しています。

問題になっているのは OS の差異による改行コードの違い、CRLF(`\r\n`) と LF(`\n`)によるものです。

公式リポジトリの Issue にもあがっていました。Open な Issue です。

https://github.com/golang/go/issues/23562

## サンプル

実際に fmt.Scanf を使う以下のような簡単な実装を考えてみます。

“`go:main.go
package main

import “fmt”

func main() {
var f, s string

fmt.Printf(“

元記事を表示

ABS Coins(ABC087B)をループ1回で解く

前々から興味はあったんですが、今年に入ってから[AtCoder](https://atcoder.jp/)をはじめました。
とりあえず出てみて慣れつつ、過去問をちょこちょこ解いたり[AOJ](http://judge.u-aizu.ac.jp/onlinejudge/)ちょっとずつやったりとかで地味に頑張ってます。
競プロはガチ勢は実行速度の早いC++とかC#とかでやってるイメージが非常に強いんですが、自分は個人的に慣れようと思ってたGoでやっています。
この記事を書いた次点ではまだ灰色ですが、継続的に頑張っていきます。

さて、ABS(※)の中にCoinsという問題があります。
https://atcoder.jp/contests/abs/tasks/abc087_b

※参考
AtCoder Beginners Selection
けんちょん(@drken)さんの下記の記事を参考にして作られた(で、いいんですよね?)、最初のチュートリアル的な10問です
[AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~](https://qiita

元記事を表示

どの8進数リテラルが使えるかはプログラミング言語によって異なる

(この記事は [地平線に行く](https://yujisoftware.hatenablog.com/entry/octet_literal) とのマルチポストです)

8進数を表記する文法は、主に以下の3つがあります。
(二番目と三番目は分かりにくいですが `ゼロ オー`[^octet] です)

* プリフィックスとして `0` を付与する (例: `0123`)
* プリフィックスとして `0o` を付与する (例: `0o123`)
* プリフィックスとして `0O` を付与する (例: `0O123`)

これらのうち、各プログラミング言語がどの文法を採用しているかを表にまとめました。

|言語|`0`|`0o`|`0O`|
|:–|:–:|:–:|:–:|
|C|○|×|×|
|PHP|○|×|×|
|Perl|○|×|×|
|Java|○|×|×|
|Scala (~2.9)|○|×|×|
|Scala (2.10~)|×|×|×|
|Kotlin|×|×|×|
|C#|×|×|×|
|Rust|×|○|×|
|Swift|×|○|×|
|Go|○|○|○|
|

元記事を表示

AtCoder Beginner Contest 162 参戦記

# AtCoder Beginner Contest 162 参戦記

## [ABC162A – Lucky 7](https://atcoder.jp/contests/abc162/tasks/abc162_a)

2分で突破. 書くだけ.

“`python
N = int(input())

if str(N).count(‘7’) > 0:
print(‘Yes’)
else:
print(‘No’)
“`

## [ABC162C – Sum of gcd of Tuples (Easy)](https://atcoder.jp/contests/abc162/tasks/abc162_c)

4分で突破. なぜか間違って先にC問題やってた. ジャッジシステムが詰まってて、オンライン実行が使えなくて時間がかかった. まあ、問題文通りに書くだけなんだけど、TLE になりそうだったので定数倍に手を入れた.

“`python
def main():
from math import gcd

K = int(input())

r

元記事を表示

Go言語: スライスの構造

# この記事について
Go言語のスライスについて、その内部構造を整理します。

# まとめ
– スライスとは、配列をラップして使いやすくした型
– スライスとラップした配列はメモリ上では別のオブジェクト
– スライスは、配列へのポインター、配列のうち使用してるサイズ `Len`、配列の実際のサイズ `Cap` をパラメータとして持つ
– `reflect.SliceHeader` でスライスの構造を見ることが出来る

# 説明

### スライスの作成

まずは、スライス(Len = 5, Cap = 8 )を作成してみる。

“`go
a := make([]byte, 5, 8)
“`

こんな構造になる。
(Pointer の値 0xc00000a0d0 は今回試した際に確保された配列のアドレス)

|![slice001

元記事を表示

Go言語: ポインターとそれに関する型(uintptr, unsafe.Pointer)

# この記事について
Go言語の以下のポインター関連の型について簡単に整理します。

– `&` で取得するアドレス
– uintptr
– unsafe.Pointer

## `&` で取得するアドレス

– 変数のアドレスを表す整数値
– 値は整数値だが、型はそれが指す型に応じて異なる

“`go:例
i := 1
s := []string{“x”, “y”}

pi := &i // pi の型は *int
ps := &s // ps の型は *[]string
“`

– 当然ながらアドレスを参照できる → `*pi`とする
– しかし、C言語のようにポインターの演算はできない → `pi++` とか出来ない

## uintptr
– Go言語の Builtin 型であり、アドレスを格納できる大きさを持つ「整数型」
– 単なる整数型なので、アドレスを参照することはできない → `*pi` が出来ない
– 単なる整数型なので、演算ができる → `pi++` とかが出来る。
– ただしC言語とは異なり単なる整数演算に

元記事を表示

Goで作った自作ツールをGithubActionsでクロスプラットフォーム向けに自動リリースするテンプレ

# Goのクロスコンパイルばり便利
Goの便利な機能の一つにクロスコンパイルがあります。
同OSでの実行ファイルはもちろんのこと、例えばMac上でWindows用のexeファイルを作ったりできます。
GithubActionsと連携することで、さらに楽にクロスプラットフォーム向けに実行ファイルをリリースできるので
やり方を紹介します。

# 前提
– Go 1.13以降
– Go Modules使用
– [今回の開発環境はVSCode Remote Containerで用意](https://qiita.com/maroKanatani/items/75c38f6ab2f474ef7d37)(ここはまぁ何でも良いと思います)

# 手順
– プロジェクト直下に以下の.goreleaser.ymlを配置。

“`yml:.goreleaser.yml
project_name: sample # 任意の名前を設定する
env:
– GO111MODULE=on
before:
hooks:
– go mod tidy
builds:
– main: .

元記事を表示

Go言語のディレクトリ構成を考えてみる

#はじめに
最近Go言語の勉強を始め、文法についてそこそこ理解したので、APIサーバーでも立ててみようと思い、ToDoリスト開発を始めたが、Railsしか触ったことがなく、ディレクトリ構成が壊滅的にわからなかったので泣きべそを書きながらもまとめてみる。

#基本的なディレクトリ構成

├ cmd //main.goはここに置く
├ db
│ └ init //データベースの初期データを記述
├ pkg
│ ├ db //データベースへの接続
│ └ dcontext //データベースの操作
├ http
│ ├ middleware //main.goを走らせる前に行いたいことはここに記述
│ └ response //主にエラー処理を記述
└ server
├ handler //railsでいうcontroller的なもの
├ model

元記事を表示

OTHERカテゴリの最新記事