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

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

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 && \
go get “github.com/go-sql-driver/mysql” && \
go get “github.com/beego/bee” && \
go

元記事を表示

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:

元記事を表示

Go言語の構造体の基本

Go言語にはJavaなどの言語でいうクラスやというものがなく、構造体というデータをひとまとめにして扱うための仕組みを使ってクラスのような機能を提供します。

この構造体を使うことで、オブジェクト指向の継承のような実装を実現することが出来、Go言語の一つの大きな特徴になっています。

この記事では構造体の宣言の仕方から、実際にどのように扱われるのかまで見ていきます。

#構造体の基本
##構造体の宣言
Go言語の構造体は以下のように変数として宣言して使用できます。

“`Go
var japanese struct {
name string
age int
}
japanese.name = “hanako”
japanese.age = 23
fmt.Println(japanese)
“`

構造体は変数だけではなく、型として宣言することもでき、こちらの方がより広く使われています。

“`Go
type person struct {
name string
age int
}

studentA := person{
name: “Taro”,
age: 20,

元記事を表示

初心者でもDockerでAmazonLinux+Go(Echo)+Mysqlの環境構築しつつ簡単なAPIを作って動かす

# DockerでAmazonLinux+Go+Mysqlの環境構築する

PHPerだったけど今度はGoやっていくので環境をDockerで作ってそこで簡単なAPIをGoのフレームワーク「[Echo](https://echo.labstack.com/)」で作っていく

# 環境

– **Docker Desktop on Windows:19.03.1**
– **AmazonLinux**(イメージ:https://hub.docker.com/_/amazonlinux )
– **MySQL:8.0**:(イメージ:https://hub.docker.com/_/mysql )
– **Go:1.13.3**
– labstack/echo
– go-sql-driver/mysql

ちなみに作業環境はWindows10 Proのi7メモリ32GBノートPCです

# ディレクトリ構成

“`
|-Dockerfile
|-docker-compose.yml
|-./src
|-main.go
“`

# Dockerfile

まずAmazon

元記事を表示

golang インタフェース

# インタフェースとは
インタフェースはメソッドのシグネチャを定義した、メソッドをひとまとめにしたものである。
また、空のインタフェースなど使い方は色々あるが、今回は私が抱いていたインタフェースはなんのためにあるのかを書いてみたいと思う。

“`go
type <型名> interface {
メソッド


}
“`

## インタフェースの役割
golangにおいて継承という概念はないため、インタフェースを用いて抽象化を行います。また、golangではインタフェースでしか抽象化ができない。ここで、抽象化とは具体的な実装を振る舞いによって共通化することである。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340562/cce01eb8-ebef-a2cb-62b3-1a9da9e7ed2b.png)

例えば上の図のように機能Aが共通している場合、インタフェースを用いて機能Aを共通化する。こうすることで、機能Aを修正するときに抽象化した1箇所を修正すればよくなる。逆に機能Aを抽

元記事を表示

ナウい言語は暗黙の整数拡張を行わないか?

# はじめに

@akif999 さんの書かれた記事『[C から Go へコードを移植してハマった話 (そして言語仕様へ)](https://qiita.com/akif999/items/a94dd8a6fe29dda2b560)』の中で

> 「あ、C のこの `a << 8` は、int に拡張されるんやった」 > 「C のプログラムがうまくいくのは、整数の演算は暗黙に int へ拡張されるからや…」
>
> 「でも、ナウい Go にはそんな暗黙の動作なんてないんや…」
>
> “`main.c
> c |= (unsigned short)(a << 8); > c |= (unsigned short)(b << 0); > “`
>
> そうです。
> C 言語は、言語が誕生した時代背景や、
言語処理系が CPU へ依存した規格となっていることのせいで、
「未定義動作」や、暗黙の型キャスト、整数の拡張などを頻繁に行います。

との記述があり、「へえ、いまどきのナウい言語は C と違って暗黙の整数拡張を行わないのか」と思ったので検証してみること

元記事を表示

OTHERカテゴリの最新記事