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

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

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

まずAmazonLi

元記事を表示

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 と違って暗黙の整数拡張を行わないのか」と思ったので検証してみること

元記事を表示

sql.DBのチューニング方法

# 概要

この内容はsql.DBに設定できるコネクションに関する以下の三つのパラメータをどう設定するか、逆に設定しないとどうなるかを説明します。

“`go
SetMaxOpenConns()
SetMaxIdleConns()
SetConnMaxLifetime()
“`

既に以下の記事で詳細に説明がされているので合わせて参照していただければと思います。この記事を書くのと、実際に業務で問題に突き当たった際に書いてある内容に非常に助けられました。
[Configuring sql.DB for Better Performance](https://www.alexedwards.net/blog/configuring-sqldb)
[Re: Configuring sql.DB for Better Performance](http://dsas.blog.klab.org/archives/2018-02/configure-sql-db.html)

この記事では自分なりに解釈した各値の設定方法と、設定しないとどのような事が起こるのか、ローカル環境で簡単に検証する方

元記事を表示

GOとmySQLをつないで読み込み書き込みしてみる

goの導入方法は https://qiita.com/auto_masanori/items/a8a0116d0f90dce70ee6 をみてください

###環境
– macOS Mojave 10.14.6
– mysql Ver 14.14 Distrib 5.7.27, for osx10.14 (x86_64) using EditLine wrapper

###ドライバのインストール
mySQLとgoをつなぐためにドライバをインストールする必要があります.

“`
$ go get “github.com/go-sql-driver/mysql”
“`

###mySQLの立ち上げ
今回はローカルにmySQLを立ち上げて接続するのでmySQLを立ち上げておきましょう.

“`
$ mysql.server start
Starting MySQL
SUCCESS!
“`
DB:todo_test 
テーブル:todos

“`
mysql> use todo_test;
Database changed
mysql> show tables;
+—-

元記事を表示

tviewで最初の1文字目が表示されない

# tviewで最初の1文字目が表示されない
[tview](https://github.com/rivo/tview)という**Go**製のOSSがあります。
これはターミナル上でTUIを表現するためのサポートライブラリです。

**tview** のデモの中に[treeview](https://github.com/rivo/tview/tree/master/demos/treeview)というものがあり、これを試そうとしたところ1文字目が画像のようにファイル名の1文字目が表示されませんでした。 `main.go` が `ain.go` とかになっていますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84459/b7c9f508-c0de-fab6-8535-e46bd122e9b3.png)

こうなった場合の解決策が issue にあがっていたので紹介します。

## 解決策
[Treeview’s first letter is lost](https://git

元記事を表示

[Go/gin]macにgoを導入してginを導入してみる

今回、goを使ったapiサーバーを作る機会がありそうなので,それに向けてgoのフレームワークであるginをmacに導入してみたいと思います.goはgooleが開発したコンパイル型言語で安定して使えるらしいです.

###環境
– macOS Mojave 10.14.6

###GOを導入
“`
$ brew install go
“`

###GOのバージョン確認
“`
$ go version
go version go1.13.3 darwin/amd64
“`
go versionでバージョンの確認ができて、正しくインストールされていたら上のように表示されます.

###Hello World!の儀式(Go)

新しい言語を扱うときは必ずしないといけない儀式を行います.
任意のディレクトリにhello_world.goを作成して、このように記述しましょう.
goはimportしたものは必ず使わないとコンパイルエラーになるので注意しましょう.

“`hello_world.go
package main

import “fmt”

func main() {
f

元記事を表示

xoでできたgoの構造体をxoやsqlに依存しないモデルに書き換えるシェル

# 概要

業務でWebアプリケーションをGoで書くにあたり、DBのORマッパーにgormを利用しているのですが、gormで各テーブルを扱うにあたりテーブル毎の構造体があると便利です。その構造体を作るにあたり、実際のテーブルからGoの構造体を作成してくれる[xo/xo](https://github.com/xo/xo)という便利なライブラリがあります。

ただ、xoは便利な反面、作成される構造体に少し調整が必要だったり、使わない関数まで作成してしまいます。
設定等で直せるのかもしれませんが、業務ではシェルを作って一括置換してしまったのでそのシェルを紹介します。

なおgormの機能で、逆に構造体からテーブルを作成するというアプローチもできるのですが、構造体にIndexやあたいのデフォルト値等DB固有の値を表現していくのはそこそこ困難なので、テーブルの方を基準として作成するというアプローチを取っています。

# 環境

DBはMySQL5.7を利用しています。
また、シェルはbash4.0以上でローカルのMac上で実行します。

(参考)[Macのbashを4.x系に変更する](htt

元記事を表示

【備忘録】Go言語のパッケージをMacで使用しようとして躓いた

# はじめに
 Go言語には便利なパッケージというものが用意されているらしく、使ってみたいと思って使ってみた。今回は、エンジニアであれば、多くの人が利用するgithubのgoパッケージを利用してみた。
 しかし、普段PythonやCなど違う言語を使用してきた人間からすると、特にパッケージの利用で躓くと思いました。そこで、githubに公開されている、GithubのGoパッケージgo-githubを例にパッケージの利用について書きたいと思います。

# 環境
macOS Mojave
go 1.13.3

# 作業ディレクトリ
 他の言語と異なる点は、作業ディレクトリだと思います。以下のサイトを参考に、ディレクトリを作ってください。GOPATHのsrcに入っていないと上手く動きません。
 https://qiita.com/mumoshu/items/0d2f2a13c6e9fc8da2a4

# パッケージ依存関係管理ツール dep
 今回は、パッケージの依存関係ツールを使います。これは、以下のサイトを参考に入れてください。
 https://qiita.com/Azizim_A/it

元記事を表示

[GKE] Google Kubernetes Engine + docker compose で開発環境を手に入れる

## TL;DR

開発する(frontend)

1. frontend ソース更新
2. make build
3. make start
4. ローカルで動作確認
5. make deploy でデプロイされる

backend 追加する

1. backend フォルダに適当になんか用意
2. backend-{deployment,service}.yaml を用意
3. Makefile への追記

## 詳細

公式の guestbook を元に go + redis な開発ができるようにする
https://github.com/kubernetes/examples/tree/master/guestbook-go

ファイル構成はこんな感じ
frontend/* に対象のサンプルファイルおいた

“`
.
├── Makefile
├── README.md
├── data
│ └── reis
├── docker-compose.yml
├── frontend
│ ├── Dockerfile
│ ├── main.go
│ └── pub

元記事を表示

Go/echo 入門

# はじめに
GoのWebフレームワークecho入門。
公式ドキュメントに書いてあることをほんのちょっとだけ深ぼってみる。

#Quick Start
なにはともあれ`go get`

“`
go get -u github.com/labstack/echo/…
“`

結論のコード。

“`go
package main

import (
“net/http”

“github.com/labstack/echo”
)

func main() {
e := echo.New()
e.GET(“/”, func(c echo.Context) error {
return c.String(http.StatusOK, “Hello, World!”)
})
e.Logger.Fatal(e.Start(“:1323”))
}
“`
ブラウザから`http://localhost:1323`に接続すると`Hello, World!`という文字列が表示されることが確認できます。

`echo.New()`はこのフレームワークの核となるEchoインスタンス

元記事を表示

OTHERカテゴリの最新記事