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

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

Go言語でポリモーフィズムとその便利さを理解する

継承・カプセル化・ポリモーフィズムはオブジェクト指向の3大要素と呼ばれています。そのうち今回の記事で扱うポリモーフィズムは日本語では多様性などと訳されますが、どのような概念なのかがいまいち分かりずらく、実装例を見ても何の役に立つのか自分には長らくピンと来ませんでした。
本記事では、ポリモーフィズムとは何か、何が便利なのかをGo言語での実装例と共に紹介していたいと思います。

##ポリモーフィズムとは?
ポリモーフィズムを一言で言うと、**「同じインターフェイスを操作しても、それを実装するインスタンスによって違う動きをさせる仕組み」**であると自分は理解しています。それによって柔軟性が増すことが利点です。

オブジェクト指向の本として有名な「オブジェクト指向でなぜ作るのか」では
>類似したクラスに対するメッセージの送り方を共通化する仕組み

と説明されています。Javaで言うと、同じクラスのメソッドを呼び出しても、そのメソッドを持つ親クラスを継承する子クラスによって実際の動きは異なってくるというところでしょうか。ポリモーフィズムはメソッドの呼び出し側で楽をするための仕掛けです。

※言葉

元記事を表示

gonum/matで単位行列を生成する

# コード

“`go
idSlice := make([]float64, n*n)
for i := 0; i < n; i++ { idSlice[i*(n+1)] = 1 } idMat := mat.NewDense(n, n, idSlice) ``` これでできる。 # サンプルコード `go get gonum.org/v1/gonum/mat`を実行して、コピペすれば動く。 ```go package main import ( "fmt" "gonum.org/v1/gonum/mat" ) func matPrint(X mat.Matrix) { fa := mat.Formatted(X, mat.Prefix(""), mat.Squeeze()) fmt.Printf("%v\n", fa) } func main() { n := 4 idSlice := make([]float64, n*n) for i := 0; i < n; i++ { idSlice[i*(n+1)] = 1 } idMat :=

元記事を表示

GO言語でmapの値に構造体を使う時はポインタにすると良いらしい

# mapの値に構造体を入れたらエラーが・・・
先日、職場でこんな感じのコードを書いたらエラー。(コードはサンプルです)

“`go:umaimono.go
package main
import “fmt”

type Food struct {
ID int
Name string
Description string
}

func main(){
fmt.Println(MakeResult()[“うまいもの”])
}

func MakeResult() map[string]Food {
result := make(map[string]Food)
result[“うまいもの”] = Food{
ID: 1,
Name: “焼肉”,
}
result[“うまいもの”].Description = “すこぶるうまい”

return result
}

“`
これを実行すると `cannot assign to struct field result[“うまいもの”].Descripti

元記事を表示

Goのディレクトリ構成(追記予定)

# Goのディレクトリ構成をきっちり知っておきたい

## /src 開発用のディレクトリ

– プロジェクトごとにsrc 以下にディレクトリをつくる。
– ソースコード管理プラットフォームごとに切るのがGoの思想的
– go install するとpkgに実行したパッケージをコンパイルしたものが作られる。
– go buildをmainパッケージで実行すると/binに実行可能なバイナリファイルが作られる。

## /bin 実行可能ファイル、バイナリ
– 環境変数PATHに設定することが推奨されている。’export PATH:=$GOPATH/bin’

## /pkg コンパイルされたファイル
– srcからコンパイルされた非アプリケーション実行ファイルの.aファイル

## tips
– githubからgo getするようなものは、実態としてはgit cloneとgo installである。

元記事を表示

goとpythonで始めるgRPCの事始め

gRPCってなんだって思って調べてたら実装してしまっていたので備忘録として残します。

## ゴール

このようなディレクトリ構造でpythonクライアントとgoサーバー間でgRPCを実装していくことをゴールとします.

“`
$GOPATH/src/pygo-grpc/
├ client/
| ├ app.py
| ├ hello_pb2_grpc.py     (gRPC自動生成)
| └ hello_pb2.py        (gRPC自動生成)
├ protos/
| └ hello.protc
└ server/
├ grpc-server/hello.pb.go (gRPC自動生成)
└ server.go
“`
## プロトコルを定義

– `$GOPATH`の配下に新しいワーキングディレクトリを作成し、プロトコルを定義します。

“`
~ $ cd $GOPATH/src
src $ mkdir pygo-grpc;cd $_
pygo-grpc $ mkdir client protocs server serve

元記事を表示

Golangらしいコードを書こう

# はじめに
この記事は未完成です。Golangらしいコードというのは文化のようなものだと考えているので、様々な方の意見を取り込みながら、この記事を充実させていきたいと考えています。よろしくお願いいたします。

# Goらしいコードの前に
全言語共通のルールについてまとめます。きれいなコードを学びたい方へのおすすめは[リーダブルコード](https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%

元記事を表示

今すぐ「レイヤードアーキテクチャ+DDD」を理解しよう。(golang)

# 今すぐ「レイヤードアーキテクチャ+DDD」を理解しよう。(golang)
とはいっても記事を読み終わるのに三時間くらいかかる気がします。
## 対象読者
– レイヤードアーキテクチャ+DDDの実装に困っている方
– バックエンドエンジニアを目指す学生
– APIサーバを開発したことがある方

## はじめに
アーキテクチャは学習コストが高いと言われています。その要因の一つとして考えられるのはアーキテクチャの概念を学んだとしても、アーキテクチャの細かい部分は実装者に左右されるので、ネット上にあるプログラムは概念とはズレがあるので混乱しやすいことだと思います。それに加えて他のサイトを参考にした時もやはり実装者による違いで混乱してしまうからです。
したがって、概念とズレがある部分はしっかり言及したうえで解説することが良いと思います。

## アーキテクチャを採用する意味
– レイヤ間が疎結合になるため、ユニットテストが行いやすいこと。
– 責務がはっきりしているので、保守性が高いこと。
– 途中からフレームワーク等を入れたとしても影響範囲が限定されるので外部の技術の変更が容易なこと。

元記事を表示

Beego+MySQL+Docker+Heroku

# はじめに
普段は,docker-composeでgolangとMySQLを管理しています.
Herokuへのアプリのアップを試みました.(DBストレージw)
個人開発でDBストレージ消費するサービス運用って,素敵なサーバどうしたものか...

# 環境
ubuntu16
Herokuアカウント・クレジットカード登録済み.
ローカルではアプリ動きます.
Dockerfileにはマルチステージビルドを採用しています.
herokuへpushするimageは25MBくらいでした.(もっと小さくしたい)

“`:Dockerfile

FROM golang:1.12.12-alpine3.9 AS build

ENV GOPATH $GOPATH:/go
ENV PATH $PATH:$GOPATH/bin

RUN apk update && \
apk add –no-cache git ca-certificates tzdata && \
go get “github.com/go-sql-driver/mysql” && \
go get “github.co

元記事を表示

Golang APIレイヤードアーキテクチャで組んでみた。

# 初めに
今回アーキテクチャを触れるきっかけは、Golangで成果物を作りたいと考えたときに、文法などの知識を知っていてもどのようにフォルダの構造を決めてどの実装から取りかかればいいかわからなかったことです。アーキテクチャを勉強することでどのpackageがどのpackageに依存しているのかを明確にすることができるとともに、どの実装から取りかかれば良いのかも依存関係から知ることができる。

##対象読者
* アーキテクチャってなんだろうという方
* Goで何か成果物を作りたいが最初何から実装すればいいかわからない方
* 他

# 実装内容
今回実装したのは、TodoリストのRESTAPIである。この記事を書いたのはGetAll()APIを実装した段階である。

# アーキテクチャ
今回はレイヤードアーキテクチャを採用しました。アーキテクチャを初めて触れるにあたり触れやすいと聞いたので採用しました。構造は以下の通り作成しました。矢印方向に依存しています。

![レイヤードアーキテクチャ.png](https://qiita-image-store.s3.ap-northeast-1

元記事を表示

Goでマルチドキュメントのyamlを読み込む方法

Go言語でマルチドキュメントのyamlを取り扱いたい.
具体的にはkubernetesのマニフェストを読み込んでごにょごにょしたかった

## マルチドキュメントyaml

“`yaml

test: 1
sample: hoge

test: 2
sample: hogehoge

test: 3
foo: foo
“`

こういうハイフン区切りになっているyamlファイル

## 実際のコード

“`main.go
package main

import (
“fmt”
“gopkg.in/yaml.v2”
“os”
)

func main() {
f, err := os.Open(“test.yml”)
if err != nil {
return
}
defer f.Close()

dec := yaml.NewDecoder(f)

var tmp map[interface{}]interface{}
for(dec.Decode(&tmp)) == nil {
fmt.Printf(“%v\n”, tmp)

元記事を表示

ノリと勢いで Go で Hello World する

# はじめに

タイトルのままです。

読み手の対象者は、
僕と同じで

– Go 言語って名前だけ知ってる
– 何ができるのか、とか、実際にコードを見たことはない
– でもなんか触ってみたい

そんな人です。

いつも通り、やりながら、書いていきます。

やることは、
[公式のなんかセットアップ系のページ](https://golang.org/doc/install) をやります

## 実行環境

持病のローカルに色々入れてはいけない病が出ちゃうので、
docker 内でやります。

docker の alpine でやります。

“`
$ cat /proc/version
Linux version 4.9.184-linuxkit (root@a8c33e955a82) (gcc version 8.3.0 (Alpine 8.3.0) ) #1 SMP Tue Jul 2 22:58:16 UTC 2019
“`

## 1. install

知らないんだから、持ってないですw

“`
$ apk add go
fetch http://dl-cdn.alpine

元記事を表示

Golangでベクトル演算を高速化しようとしてみた話

# はじめに

Goでスライスのベクトル演算などを書いてたときに、今までは

“`go
for i := 0; i 対象の演算

元記事を表示

Goで指定日の0時ジャスト(00:00:00)を取得する処理とテスト

#概要
担当しているプロジェクトで当日の0時ジャストのタイミングを取得したいという要件があり、以下の記事を参考に実行しました。

[golangのtime.Timeの当日00:00:00を取得する方法とベンチマーク](https://qiita.com/ushio_s/items/3e270933641710bbd88e)

が、実装にあたり問題があったので0時ジャストを取得する方法を確認しつつ、時間処理で注意すべきことをまとめます。

# TL;DR

処理速度を求めないのであれば、以下のようにすればできます。処理速度を求めるのであればUnixTimeを使ったやり方がありますが、タイムゾーンの処理で問題が起こる可能性があるのでこの記事を読むことをお勧めします。あと、時間処理はテスト書いた方が良いです。

“`go
func (timeUtil *TimeUtilUsingDate) GetJust0AM(t time.Time) time.Time {

return time.Date(t.Year(),
t.Month(),
t.Day(),
0, 0, 0, 0

元記事を表示

Prometheus APIをGolangのプログラムから呼び出してexporterから収集されたメトリクス情報を取り出す

Prometheusサーバで収集されたデータの取り出し方として、PrometheusはHTTP APIを提供しています。
[Prometheus HTTP API](https://prometheus.io/docs/prometheus/latest/querying/api/)

Exporterをカスタマイズして作成する方法はたくさん記事がありましたが、PrometheusのデータをHTTP APIから取得する方法についての情報があまり見当たらなかったので備忘のため記録しておきます。

## Prometheus HTTP APIをcurlで呼び出してみる

“`json:prometheusに登録されているtarget一覧の取得

$ curl -G “http:///api/v1/targets” | jq .
{
“status”: “success”,
“data”: {
“activeTargets”: [
{
“discoveredLabels”: {
“__a

元記事を表示

Goのmath/randの共有ロックでハマった

## 概要

Go で rand.Float64() を使ったアプリケーションを実装したのですが、goroutine を用いて並列処理をしたときにパフォーマンスが出ませんでした。
pkg/profile でプロファイリングをすると math/rand.Float64 の呼び出しに時間がかかっていることがわかりました。

## プロファイリング結果

以下 pprof を用いたプロファイリングの解析結果です。

“`
(pprof) top -cum
Showing nodes accounting for 112.74s, 62.62% of 180.04s total
Dropped 67 nodes (cum <= 0.90s) Showing top 10 nodes out of 45 flat flat% sum% cum cum% 0 0% 0% 155.60s 86.43% github.com/d-tsuji/tpsa.(*TPSA).Solve.func1 7.12s 3.95

元記事を表示

Goでよく見るnewとNewを調べたときのメモ

# はじめに
Goのソースコードを読んでいて、構造体関連で `new` や `New` をよく見かけていたのですが、それぞれの意味や違いをあまり理解していなかったので、それらを調べたときのメモです。

# new
newは指定した型のポインタ型を生成する関数です。
例えば、構造体型のポインタ型を生成できます。

“`go:newを使った初期化
type person struct {
height float32
weight float32
}

func main() {
p := new(person)
p.height = 182.0
p.weight = 75.5
fmt.Println(p) // &{182 75.5}
fmt.Printf(“%T”, p) // *main.person person型のポインタであることがわかる
fmt.Println()
fmt.Printf(“%p”, p) // 0xc00001e060 もちろんアドレスもある
}
“`

構造体型のポインタ型を生成する手段としては、他にアドレス演算子を使う方法もあります。

元記事を表示

【Go】goimportsによるimportのグルーピングが不満なので実装した

# 実装
[github.com/istsh/goimport-fmt](https://github.com/istsh/goimport-fmt/tree/master)

## 実装するに至った背景
筆者は普段、`gofmt`や`goimports`を使用しているのですが、importの順序が毎回決まった順序にならず、手動で直すことが何度もあったので、自動でソートしてくれる機能を実装することにしました。

# importの順序
https://github.com/golang/go/wiki/CodeReviewComments#imports

importは下記のようにグルーピングして空行を入れて記述することになっています。

“`go
package main

import (
// 標準パッケージ
“fmt”
“hash/adler32”
“os”

// サードパーティのライブラリ
“appengine/foo”
“appengine/user”

// 自プロジェクト
“github.co

元記事を表示

AtCoder Beginner Contest 144 参戦記

# AtCoder Beginner Contest 144 参戦記

## A – 9×9

2分で突破. 書くだけ.

“`python
A, B = map(int, input().split())

if A < 10 and B < 10: print(A * B) else: print(-1) ``` ## B - 81 7分で突破. 書くだけだったんだけど、コードテストが正しく動かなくて(何故か標準出力が戻ってこない)、無駄に時間を使ってしまった. ```python from sys import exit N = int(input()) for i in range(1, 10): for j in range(1, 10): if N == i * j: print('Yes') exit() print('No') ``` ## C - Walk on Multiplication Table 5分で突破. できるだけ小さい数の掛け合わせがいいので、sqr

元記事を表示

DBなしで動かせる、標準パッケージのみを用いたGo言語でのRest APIの実装例

本記事では、まずRESTとは何かを説明し、Go言語でのREST APIの実装例を紹介します。RESTについての理解があやふやであるという方も、REST APIの実装を見ることでRESTについてより深い理解が得られるでしょう。この記事で使用するソースコードは[こちら](https://github.com/masalennon/golang-simple-rest-api/blob/master/main.go)に載せてあります。

それでは、まずRESTとは何かというところから説明していきます。

##RESTとは?

まず、RESTを一言で言うといくつかの原則に基づいた、Webシステムを設計する際の設計モデルです。ちなみにRESTとは、Representational State Transferの略です。

なので、RESTとは何か、と問われた時には「Webシステムを設計する際の設計モデルのことです。」と回答し、それからその原則について説明していくことになります。

###RESTの原則
RESTには、いくつかの原則があり、この原則がRESTの本質部分です。この原則を遵守したシステ

元記事を表示

Golang で string 型の enum 的なもの

## やりたいこと :relieved:

連続する数値の文字列

“`golang
const (
zeroStr = “0”
oneStr = “1”
twoStr = “2”
threeStr = “3”
fourStr = “4”
fiveStr = “5”
)
“`

をintみたく:point_down:iotaで自動採番したい。

“`golang
const (
zeroInt int = iota
oneInt
twoInt
threeInt
fourInt
fiveInt
)
“`

## やったこと :angel:

asciiにしてあげる

“`golang
const (
zeroStr = string(iota + ‘0’) // ‘0’ == 0x30
oneStr
twoStr
threeStr
fourStr
fiveStr
)
“`

以上です:relaxed:

元記事を表示

OTHERカテゴリの最新記事