Go関連のことを調べてみた2019年11月12日

Go関連のことを調べてみた2019年11月12日

【Go】コーディングTips

# はじめに

Goを書いていて便利だと思ったコーディング方法を溜めていきます。

# 構造体をフィールド名付きでPrintする

ただ `fmt.Println` するとフィールド名が付かないので見づらいときに。

[The Go Playground](https://play.golang.org/p/JNYf0-ygQ1n)

“`go
fmt.Printf(“%+v\n”, data)
“`

“`
{name:山田太郎 age:23}
“`

# 長さがNの文字列を生成する

文字数制限のメソッドをユニットテストしたいときに。
「1000文字も手打ちできないよ〜」みたいなときに。
ちなみに長さは指定した分になるけど、値は空っぽ。

[The Go Playground](https://play.golang.org/p/e-J8S7HOXja)

“`go
str := string(make([]rune, 1000))
“`

# ある文字をN個生成したい

デバック中、見たいログを目立たせるときに。

[The Go Playground](https:

元記事を表示

ゲームボーイのエミュレータをGoで作った話

## 前置き

1か月ほど前にbokuwebさんの[ゲームボーイエミュレータをGo言語で書いた](https://blog.bokuweb.me/entry/gopher-boy)というブログ記事を見ました。

ゲームボーイ世代(正確にはGBC)であったのとGOで何かしたいと思っていたのもあって、僕もゲームボーイのエミュレータに取り掛かってみることにしました。

## できあがったもの

元記事を表示

golang error handling (Go1.13)

# 初めに
自分で簡単なWebサービスを作っていくにあたり、どこでどういうエラーが起こったのかわかりにくく、エラー解消に多くの時間を割くということがおきた。そのため、エラーハンドリングを学び、この問題を解消したいと考えた。

#version
go version go1.13.3

#対象読者
* エラーハンドリングって何?という人
* エラーハンドリングをやっていきたいが、何が正解かわからない人
* 一緒にエラーハンドリングについて考えてくれる方

# 躓いたところ
GolangのVersionが上がりライブラリerrorsに変更が加えられた。そのため、今までのエラーハンドリングと違うやり方になったらしい。それでは、どういう場合にどういうエラーハンドリングを採用すればいいかというところで沼にハマってしまった。
[Go1.13 ライブラリerrors](https://blog.golang.org/go1.13-errors)
# エラーハンドリングをする意義
*初めに*で書いたように、エラーハンドリングは「どこに」「何をきっかけに」「どういう」エラーが起こったのかをサーバー側で判

元記事を表示

Wireを用いたGoのDI

アプリケーション開発において、ある処理を実装するときに、複数のコンポーネントを組み合わせて実装することがよくあると思います。DIとは、ソフトウェアのデザインパターンの1つで、制御の反転を実現します。コンポーネントの作成時に依存するコンポーネントを注入する考えです。

[google/wire](https://github.com/google/wire) を用いて DI を実現する例を考えてみます。

Wire が作られた背景などは [Compile-time Dependency Injection With Go Cloud’s Wire](https://blog.golang.org/wire) が詳しいです。

## ナイーブな実装

例として、以下のような構造を持つ、ユーザのパスワードを登録するアプリケーションを考えてみます。
ユーザから、名前とパスワードをうけとって、パスワードをハッシュ化して、永続化する…というシーンを想定します。

![Wire.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.

元記事を表示

MacにDockerでGolang環境を作ってみる – vol.2 Docker起動?

今回の記事は、以下を参考に作成しました。
で、自分なりに「あれ?」って詰まったところ?を捕捉しつつ記載します。

こちらの記事にお世話になりました。
メインのやった内容はこちらなので、
並行して読んでいただけるとありがたいです。
https://qiita.com/yonaimineakio/items/0990648bbce64de7edfa

# 作業ディレクトリ作成 & ファイル配置
 今までHomeにいたので、任意の場所に移動して、ディレクトリを作ってみました。

“`
  $ mkdir go_doc
  $ cd go_doc/
“`

 ここで移動した「go_doc」ディレクトリに、以下のファイルを作成します。
 (元記事参照)
  ・main.go
  ・Dockerfile

 つまり、階層はこんな感じ。

   **任意の階層**
   **  ∟ go_doc**
**       ∟ Dockerfile**
**       ∟ main.go**

## Dockerfile って何書いてんの?
で、この状態から、以下のDocke

元記事を表示

Go言語でシンプルなgRPCサーバーを構築する

## まえがき

この記事は以下の順序で組み立てられています。

1. gRPC用のコードを自動生成する
2. APIとして呼び出される関数の実装をする
3. gRPCサーバーとして起動する
4. CLIツールを使って呼び出してみる

記事を書くために動作確認をしている環境は“Ubuntu18.04“です。
ただしMacやその他のOSでも、ツールのインストール周りを公式のドキュメントに差し替えて頂ければ動かせるかと思います。

間違いなどありましたら、コメントや編集リクエストなどを貰えると嬉しいです。

## gRPC用のコードを自動生成する

#### 1. リクエストとレスポンスの構造を定義する

まずはProtocol Buffersと呼ばれる、構造を定義する為の言語を使って、リクエストやレスポンスを定義していきます。

*“example.proto“*

“`protobuf
syntax = “proto3”;

package pb;

message HelloRequest {
int64 id = 1;
string name = 2;

元記事を表示

いろんな言語でCPUのコアを使い切ってみる

## 経緯
仲間内で「コアを使い切るプログラムをいっぱい書いてみよう」という話題が出たためノリで書いてみました。せっかくなので ~~時間がないため~~ 仕事でよく使っている `Ruby` `Elixir` `Go` の3言語で試してみました。

**マサカリ防止対応**
– 実用性、最適化などは一切考えておらず ただコアを使い切ることにフォーカス。
– そのため処理速度やsyntaxは無視
– 標準ライブラリしか使わない
– 30分で書けるレベルのものという制約で殴り書きをする

### 実行環境
image.png
**OSが古いというツッコミはダメです**

– ruby
+ 2.6.4
– Elixir
+ 1.9.4
– golang
+ 1.12.7

### テストシナリオ
1. 1〜100

元記事を表示

Go言語でPKCEのCodeVerifierからChallengeに変換する

# はじめに
業務でOAuth2のPKCEの対応(Mobile側)をすることになった。
当方はAndroidエンジニアだが、サーバサイドとの疎通がうまくいかない。
レスポンスを見る限りPKCEのCodeVerifierからChallengeに変換できていないようだ。
サーバサイドからおかしなところがあったら指摘してくれ、と言われたので与えられている情報から修正案を作ってみた。
なお、Go言語はSoftware Designの記事で少し触ってみただけで業務で使ってないので俺に聞くなというスタンス。

# PKCEとは
簡単に言えば認可コード横取りを防ぐ仕組みです。
この記事がわかりやすいと思います。
https://qiita.com/samiii/items/9574d1e237228c718cd6

# どんなことが起こっていたか
最初にコードを取得するところは問題ない。(Mobile側で作ったChallenge渡すだけなので)
実際にtokenを取得する際に *”不正なCodeVerifier”* と言われている。
ただ、Mobile側で(確認用に)使用しているCodeVerifi

元記事を表示

Goの様々な知見

# 自分がGoぶつかった課題の解答をまとめます

## #1ファイルをGCSに上げるときにぶつかった

“`go
//リクエストのファイル取得
file, handler, err := this.Ctx.Request.FormFile(“file”)
//コンテキスト作成
ctx := context.Background()
//トークン使ってクライアント作成
client, err := storage.NewClient(ctx, option.WithCredentialsFile(“/go/src/keipass-api/conf/xxx.json”))
//バケットと名前指定して
writer := client.Bucket(“xxx”).Object(“xxx.png”).NewWriter(ctx)
//保存
writer.Write(file) <-ファイルがバイナリじゃないって怒られる ``` multipart.Fileはio.Readerインターフェースを実装しているため、次のようにそのコンテンツをbytes.Bufferにコピーする。 ```go

元記事を表示

Goで作成したToDoアプリにRESTful APIを追加してみる

#
[Go x Gin x GORMでToDoアプリを作成してみる](https://qiita.com/hanadaUG/items/0fd5ddc0407c4ab55d0f)で作成したToDoアプリに追加する形で機能拡張や使用したことのない技術を試していきます。
今回はCRUDのRESTful APIを追加します。

# 開発環境
– MacBook Pro
– go version : 1.12.9

“`terminal:version
$ go version
go version go1.12.9 darwin/amd64
“`

# 事前情報
Webフレームワーク : [Gin](https://github.com/gin-gonic/gin)
ORM : [GORM](https://gorm.io/docs)
DB : sqlite3
依存関係管理ツールdep : dep

“`terminal:プロジェクト構成
├── Gopkg.lock
├── Gopkg.toml
├── README.md
├── api
│   └── v1
│  

元記事を表示

gomock使っていてimport cycle not allowedになってしまったので self_package フラグで対応した

## はじめに

[gomock](https://godoc.org/github.com/golang/mock/gomock)を使ってテストモックを管理する際、self_package というフラグを使うことになりました。このフラグに関して利用方法が書いてある記事がネット上に少なかったので書きます。

## Version

“`
$ go version
go version go1.13.1 darwin/amd64
$ cat go.mod | grep mock
github.com/golang/mock v1.3.1
“`

## 構成

`domain.go`が`repositories.go`を利用する構成。repositoriesはDBにあるデータとやり取りするためのインターフェースを持っています。

“`
tagservice
├── domain.go
├── domain_test.go
└── repositories.go
“`

## やろうとして失敗したこと

自動生成されるモックのファイルを同じ階層に持つのが嫌だったので1

元記事を表示

go-redisでSADDした時の挙動

“`go
package main

import (
“fmt”
“time”
“strconv”
“github.com/go-redis/redis”
)

func getRedisClient() (*redis.Client) {
client := redis.NewClient(&redis.Options{
Addr: “localhost:6379”,
Password: “”, // no password set
DB: 0, // use default DB
})
return client
}

func main() {
rc := getRedisClient()
ts := strconv.Itoa(int(time.Now().Unix()))
key := “set:

元記事を表示

dbpediaの研究 その26

#概要

dbpediaが難解なので、手出してみる。
goで、取得してみた。

#サンプルコード

“`
package main
import (
“fmt”
“io/ioutil”
“net/http”
“log”
“net/url”
“strings”
)
func main() {
values := url.Values{}
values.Add(“query”, “SELECT DISTINCT * WHERE { dbpedia-ja:デ・トマソ dbpedia-owl:abstract ?abstract .}”)
values.Encode()
res, err := http.PostForm(“http://ja.dbpedia.org/sparql”, values)
if err != nil {
log.Fatal(err)
}
fmt.Printf(“[status] %d\n”, res.StatusCode)
for k, v := range res.Header {

元記事を表示

go-redisでSET 0,-1

“`golang
package main

import (
“fmt”
“time”
“strconv”
“github.com/go-redis/redis”
)

func getRedisClient() (*redis.Client) {
client := redis.NewClient(&redis.Options{
Addr: “localhost:6379”,
Password: “”, // no password set
DB: 0, // use default DB
})
return client
}

func setKey(ttl int) {
rc := getRedisClient()
ts := strconv.Itoa(int(time.Now().Unix()))
s

元記事を表示

【Go】goenvを使ってGo1.13.4の環境構築

Goはじめよう。
rubyにrbenvあるみたいに
goenvっていうのを入れたらバージョン管理が楽になるらしい。

ということで、環境構築はじめましたが一度`go1.11.4`を入れてしまいました。
それから`go version go1.13.4 darwin/amd64`ってターミナルに
表示されるまでにやったことの備忘録。
もしお気づきのことがあれば、コメントいただけると助かります。

#### 本トピックの環境

“`
macOS Mojave ver. 10.14.6
Homebrew インストール済
“`

#### 参考にしたサイト・記事

– [Go公式](https://golang.org/)
– [goenv installation](https://github.com/syndbg/goenv/blob/master/INSTALL.md)
– [goenvでgoをインストール 〜初心者向け〜](https://qiita.com/yut-kt/items/9f5ac1e788df61f64290)
– [goenvを使ってMacにGo1.12.xの開

元記事を表示

go-redisのSMEMBERSの挙動

“`go
package main

import (
“fmt”
“github.com/go-redis/redis”
)

func getRedisClient() (*redis.Client) {
client := redis.NewClient(&redis.Options{
Addr: “localhost:6379”,
Password: “”, // no password set
DB: 0, // use default DB
})
return client
}

func main() {
rc := getRedisClient()
//key := “sonzaisurukey”
// ok
key := “sonzaishinaikey”

元記事を表示

Go言語でJSONデータを構造体への変換無しでネイティブに操作する

#概要

Go言語でJSON データを取り扱う場合、通常は「構造体にアンマーシャリング」→「構造体の状態で計算」→「JSONにマーシャリング」という個人的には面倒だと思われる操作をするのが基本。なので、構造体に都度都度変換するのではなく、JSONで済ませられるならJSONで済ませられるライブラリを使いたい、というのが動機。bitly の go-simplejson というライブラリがあるんだけど、Slice や Array の操作、検索には不十分だった(と思った)ので、そこらへんを強化すべく自分で機能を拡張してみた。その後、Matthias Schneider さんによりにフォーク&HTMLなどのパース機能拡張などされているので、そちらを紹介します。

#利用方法

簡単ですが以下に記します。
### ライブラリをクローン

“`
% go get github.com/mschneider82/go-simplejson
“`

### Go言語の中でimport宣言
“`
import (

“github.com/mschneider82/go-simplejson”

元記事を表示

ぼやきからのアイディア?DeclarativeなGolang API Framework

CodeGenに疲れた。
コードからドキュメント起こしてほしい。

Swaggoは確かにあるんだけど、ドキュメントコメントで書いちゃったら、コメントと実装の乖離が起きるじゃんって話で、Swagger別に書くのとあんま差分ない。
強いて言えば、SwaggerのYAMLと実装ほど距離が空いてない、てくらい?

## こんなふうに書きたい

“`go
package api

import (
“kyoh86/declarest/decl”
“kyoh86/declarest/declhelper”
)

func NewTaskService() decl.Service {
s := decl.Service{
BaseOptions: []decl.Option{
decl.OptionProducer(declhelper.JSONFormatter),
decl.OptionAcceptor(declhelper.JSONFormatter),
decl.OptionDefaultError(declhelper.JSONError),
},
}

元記事を表示

golangでの自分のためのお作法まとめ

# 命名規則
– 基本的には、[Effective Go](https://golang.org/doc/effective_go.html#names)に則り記載する。
– 変数やメソッド名は基本的にキャメル・パスカルケースにする。
– ファイル名についてはスネークケースにする。

# error handling
– 基本的には、[go blog](https://blog.golang.org/error-handling-and-go)

## 参考サイト
[ゼロ値を使おう #golang](https://qiita.com/tenntenn/items/c55095585af64ca28ab5)

元記事を表示

pprofのweb viewでパフォーマンス測定

### 概要
pprofでサーバーのパフォーマンス検証する時、
web viewで簡単にボトルネックを特定できます。
### pprofとは
go toolに入っているプロファイラーツール
関数単位でボトルネックになっている処理を特定できます
https://golang.org/pkg/net/http/pprof/
UI上で処理の流れがこんな感じに見れます

![pprof.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254185/ee5aa2f6-7b35-c776-4c08-bcd9ab160230.png)

## 使用ツール
1. Go

“`
go version
go version go1.13 darwin/amd64
“`

2. [graphviz](http://www.graphviz.org/)

dotファイルとかをいい感じに可視化してくれるツール
今回は吐き出されたプロファイルを見やすくしてくれる

“` shell
brew install graphviz

元記事を表示

OTHERカテゴリの最新記事