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

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

GolangのWebAPIをsupervisorでデーモン化して公開する。

GolangのWebAPIをデーモン化して公開する際に役立った情報の備忘録です。

##使用環境

Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type (無料使用枠)

##デーモン化とは

そもそもGolangのWebAPIを公開する方法を知らず、Linux上で”GO RUN main.go”を実行すればよいのかと考えていた。この方法だと、RLoginなどで接続を閉じたタイミングで処理も終了してしまって上手く行かなかった。

調べるうちに、デーモン(UNIX系OSにおいて、常時待機しているプログラムを指す)というものに行きついた。[Golang デーモン]で検索すると多数ヒットしたので、Golangのmain.goを常駐化させる方針を立てた。

##supervisor
Golangのバイナリを常駐化させる為のツール。
Nginx同様にconfファイルで設定を行う必要がある。

##supervisor.confの編集
“`vim
sudo vi /etc/supervisord.conf
“`

##supervisor.conf

元記事を表示

【Golang】ゴルーチン②チャネル

#【Golang】ゴルーチン②チャネル

Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

“`
package main

//channel
//スレッド同士のデータのやり取り

//複数チャネルを作って、処理することも可能

import (
“fmt”
)

//sからcへ送信する処理
func goroutin1(s []int, c chan int) {
sum := 0
for _, v := range s {
sum += v
//都度、計算結果を出力
fmt.Println(sum)

}
//全て処理が終わったら、channelに送信
c <- sum } func main() { /* //var 変数 chan データ型 var ch chan int //送信専用と受信専用の型を指定すると厳密になり、異なる場合、コンパイルエラーになる。 //送受信に制限を設けない方がオススメ。 //受信専用チャネル var ch1 <-cha

元記事を表示

go generate のベストプラクティス

## 概要

Go 言語におけるコード生成 ([go generate](https://golang.org/cmd/go/#hdr-Generate_Go_files_by_processing_source)) について、自分の中でベストプラクティスと思えるものが最近増えてきたので、ここでまとめて紹介してみたいと思います。

## wtz.go と time について

go generate のベストプラクティスを説明するにあたり、この記事では wtz.go と time の 2 つのライブラリを実例としてとりあげます。

[wtz.go](https://github.com/yaegashi/wtz.go) は筆者が [Go 標準ライブラリ time](https://golang.org/pkg/time/) を参考にして作成したもので、 Windows タイムゾーンをどの OS や実行環境でも扱うためのライブラリです。これを使うと、例えば `Tokyo Standard Time` のような Windows 独自のタイムゾーン文字列と [time.Location](h

元記事を表示

Goでよく使われるgormを理解する:Preloading編

##はじめに
golangでアプリケーション開発を行なっている方だと、gormを使用されている方も多いのではないでしょうか。
自分もここ最近、golangを使ったWEBアプリケーションの開発を業務で行なっていますが、十分にgormの仕様を理解できておらず、実装で詰まってしまうことがあったので、この辺りで改めてgormのドキュメントと向き合い、Qiitaにまとめていければと思っています。

基本的には、[GORMドキュメント](https://gorm.io/ja_JP/docs/associations.html)に沿って挙動を確認していきますので、ドキュメントも合わせて見ていただけるとよいかと思います。ただし、個人的に確認不要と判断した箇所については割愛していますので、予めご了承ください。

#Preloading (Eager loading)
Preloadingは事前読み込みのことです。多くのormで実装されている機能ですが、gormでも`Preload(struct’s)`を指定することで、リソースを先読みしてキャッシュできるようなります。

##Preload
###Pre

元記事を表示

Go言語「スライスが分からない件」を解決する

Go言語のスライスはとても便利なのですが、いまいちGo言語のスライスが分からないのはなぜでしょうか。いろいろなプログラムを作って検証してみましょう。

# 基本

例えば、“[]int“のスライス(intの可変配列とも言える)を作成し、適当に初期化して値を一気に表示するプログラムは、以下のようになります。

“`basic.go
package main
import “fmt”
func main() {
a := []int{0, 1, 2, 3, 4, 5}
fmt.Printf(“%#v\n”, a)
}
“`

実行結果:

“`
$ go run a.go
[]int{0, 1, 2, 3, 4, 5}
“`

## 部分的に取り出す

データを取り出すには、“a[要素番号]“。部分スライスを取り出すには、“a[i1:i2]“のように書きます。なお、i2には終わりのインデックス+1の値を指定します。

“`substring.go

func main() {
a := []int{0, 1, 2, 3, 4, 5}
b := a[0:3

元記事を表示

「Golang」 ×「gorilla/mux router」でシンプルなREST APIサーバーを開発する

# Why Golang?
`Golang`の特徴として「シンプル」「静的型付けのため高速」「マルチプロセッシングによる並列処理」があります。

このような特徴から`Docker`や`Kubernetes`などの高速処理を要求されるインフラ基盤構築サービスでも使われており、またイーサリアムの`Geth`など「ブロックチェーン」の基盤として活用されているケースもあるようです。

また、`C言語`をベースに開発された言語のため、「構造体」「ポインタ」「チャネル」など普段`Typescript`や`Python`などのコードを書いていると若干とっつきにくさはあるのですが、C言語よりは数段理解がしやすく、短い記述で処理を書くことができます。
(私自身、C言語で挫折した経験があったので、若干不安ではありましたがコードがシンプルなため他の言語の経験があれば学習コストは非常に低いと思います。)

**まとめると「比較的学習コストが低い」かつ「高速」… 最高ですね!**

`Google`→`Golang`ときたら`gRPC

元記事を表示

【Golang】ゴルーチン(並行処理)

#【Golang】ゴルーチン(並行処理)
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

“`
package main
//goroutineとsync.WaitGroup
//goroutinの基礎

//軽量のスレッド 並列処理のこと
//暗黙的にGoはやってくれるため、他の言語ほど深い知識がなくても
//勝手にやってくれる

import (
“fmt”
“sync”
“time”
“runtime”
)

//並列処理
//3
//引数でポインタを宣言
func goroutin(wg *sync.WaitGroup){
//3
//wgを終了する
defer wg.Done()
for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(i) } } /* wg.doneが無かったり、wg.Add(1)が複数あるとエラーになる。 */ //1 //通常の処理 func normal(

元記事を表示

Goでよく使われるgormを理解する:Associations編

##はじめに
golangでアプリケーション開発を行なっている方だと、gormを使用されている方も多いのではないでしょうか。
自分もここ最近、golangを使ったWEBアプリケーションの開発を業務で行なっていますが、十分にgormの仕様を理解できておらず、実装で詰まってしまうことがあったので、この辺りで改めてgormのドキュメントと向き合い、Qiitaにまとめていければと思っています。

基本的には、[GORMドキュメント](https://gorm.io/ja_JP/docs/associations.html)に沿って挙動を確認していきますが、個人的に確認不要と判断した箇所については割愛しますので、予めご了承ください。

#Associations
アソシエーションとは、みなさんご存知の通り、「テーブル同士の関連付け(リレーションシップ)をモデル上の関係として操作出来るようにする仕組みのこと」ですね。

<参照>[【Rails】アソシエーションを図解形式で徹底的に理解しよう!](https://pikawaka.com/rails/association)

##Auto Crea

元記事を表示

Goの30秒で始められるGraphQLサーバー構築

# 前提
– dockerとdocker-composeインストール済み
– prisma cli インストール済み

# どのような物を作るか?
単純に`Hello World!`などのメッセージ一覧を返したり
メッセージを新規作成したり更新、削除したりといった
GraphQLのCRUD APIサーバーを構築します。

#gqlkitをgit cloneし、コンテナを起動する

まずは、[gqlkit](https://github.com/gqlkit-lab/gqlkit)というdockerアプリケーションフレームワークをgit cloneし、コンテナを起動しましょう。
これで、半分は作業が完了しました!

“`
git clone git@github.com:gqlkit-lab/gqlkit.git
cd gqlkit
cp .env.example .env
docker-compose up -d
“`

# PostgreSQLに、データの雛形をマイグレートする
今回、どのようなデータモデルをマイグレートするのかを確認しておきましょう。
gqlkit-serve

元記事を表示

【Golang】interface②タイプアサーション

#【Golang】interface②タイプアサーション
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

“`
package main

import (
“fmt”
)

//interface2の使い方
func do(i interface{}){
//1
/*
//int型に直す。正しければ復元する
//タイプアサーション 
ii := i.(int)
// i = ii * 2
ii *= 2
fmt.Println(ii)

//str型に直す
ss := i.(string)
fmt.Println(ss + “!”)
*/

//2
//interfaceをtype毎に条件分岐 vを変換
//スイッチタイプ文
//switch v := i.(type) はセットで覚える(型アサーション)
switch v := i.(type) {
case int:
fmt.Println(v * 2)
case string:
fmt.

元記事を表示

【Go】Golandでテストから書く開発

# 前書き
– 私のPC & OS

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317515/ef842cf7-3975-73bf-bfad-cd7df7dcf9a4.png)

– 今回のソースコードはこちら
https://github.com/wataboru/golang-test-driven-dev

# 前準備

## プロジェクト作る
– Golandにて、`File -> New -> Project…`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317515/a168c740-6b8b-0f15-bab2-76818a18bcbb.png)

## ディレクトリ作成
今回はサンプルとして型変換処理を作成します。
以下の通りディレクトリを作成

“`
– goalng-test-driven-dev(root)
∟ pkg
∟ convert

元記事を表示

【Golang】interface型

#【Golang】interface型
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

“`
package main
//インターフェース
//指定したメソッドを保持して欲しい時にインターフェースを使う
//異なるstructで共通のメソッドを持たせたい。

/*interface用途

1、異なる構造体で共通のメソッドをまとめられる。

2、どんな型も入るが、関数内で計算などを処理する場合は型アサーションする必要がある。

3、カスタムエラー、Stringerを設定できる。
*/

//interface1の使い方
import (
“fmt”
)

//interface 型みたいな感じ
//同じメソッドを持つstructをまとめる
type Human interface {
//共通のメソッドを持つ
Say() string
}

type Man struct {
Name string
}

type Woman struct {
Name string
}

t

元記事を表示

golang bulitinのprintとruntime

# golangでCPU数やgoroutine数を知るためのruntimeを流してみた。ついでに、builtinのprintを使ってみた

go routineを呼んで、その数が変わることを確かめた。

“`test_runtime.go
package main

import (
“runtime”
“time”
)

func RuntimeSurvey() {
print(“NumCPU:”, runtime.NumCPU(), “\n”)
print(“NumGoroutine:”, runtime.NumGoroutine(), “\n”)
print(“Version:”, runtime.Version(), “\n”)
print(“OS:”, runtime.GOOS, “\n”)
}

func main() {
go func() {
time.Sleep

元記事を表示

並列・並行処理(できるだけ簡単な実現方法)

こんにちは。
並列・並行処理の実現方法を調べてみました。できるだけ簡単な方法が他にもあれば書き足したいです。

### Unix

“`shell
$ seq 10 | xargs -n 1 -P 8 exec_something
“`

### Go

“`go
maxProc := 8
limiter := make(chan struct{}, maxProc)
items := []int{1,2,3,4,5,6,7,8,9,10}
var wg sync.WaitGroup
for _, item := range items {
wg.Add(1)
go func(i int) {
limiter <- struct{}{} defer wg.Done() exec_something(i) <-limiter }(item) } wg.Wait() ```

元記事を表示

【Go1.14】GOPATHが$HOME/goから変わらない時にやった事

# 前提
– 私のPC & OS
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317515/62efac04-c6a3-6b87-d77d-0ee4de590474.png)

– goのversion

“`
~ » go version
go version go1.14.3 darwin/amd64
“`

# 困った事
– 環境変数を上書きしてPATHを設定しても、GOPATHだけがデフォルトから変わらない。

“`.bash_profile
export GOPATH=/Users/myname/workspace/go
export GOROOT=/Users/myname/sdk/go1.14.3

export PATH=$PATH:”$GOROOT/bin”
export PATH=$PATH:”$GOPATH/bin”
“`

“`
~ » go env GOPATH
/Users/myname/go
“`

# やったこと

– ヘルプコマンドから[公

元記事を表示

【Golang】構造体④コンストラクタ

#【Golang】構造体④コンストラクタ
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

“`
//コンストラクタ
//__init__の部分を書く

//Pythonの場合 クラス、メソッド
/*
class Vertex(object):

def __init__(self, x, y):
self._x = x
self._y = y

def area(self):
return self._x * self._y

def scale(self, i):
self._x = self._x * i
self._y = self._y * i

v = Vertex(3, 4)
v.scale(10)
print(v.area())
*/

package main

import (
“fmt”
)

type Vertex struct {
X, Y int
}

//2
//コンンストラク

元記事を表示

golang switch fallthrough

# golang の switchで使う fallthroughを試してみた

次のcase文に、条件に関わらずに進む。
この例だと、Aの条件が成立して実行されたあと、fallthroughで、
Case Bの節を実行する。
Case Cは実行されないので、その中のfallthroughは通過しない。
もしa=Cだったら、defaultも
実行される。

“`fallthrough.go
package main

func main () {
a := “A”
switch a {
case “A”:
println(“A”)
fallthrough
case “B”:
println(“B”)
case “C”:
println(“C”)
fallthrough
default:
println(“end”)
}
}

元記事を表示

ファイルの変更を監視してコマンドを実行するCLIツール「monitor」を作成した話

# 概要
AtCoderや機械学習の前処理を行うようなスクリプトを組む場合,変数の状態をprintデバッグすることが多く,変更を加えて再実行して結果を確認する一連の作業がめんどくさいと感じていました.
そこで,ファイルの変更があった場合に事前に引数で渡したコマンドを実行してくれるコマンドラインツール`monitor`を作りました.
この手のCLIツールは探せばより優秀なものがすでにあるとは思いますが,とりあえず作ってみたことで愛着が沸きますし勉強になりました.![タイトルなし.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271810/026bf835-8a15-07b6-32cc-0c6e756e7ccd.gif)

# 実装
https://github.com/maitaken/monitor
実装言語は使ってみたかったという理由でGo言語を選択しました.

# インストール方法
GOの設定(GOPATHなど)がされているのであれば,以下のコマンドでインストールできます.GOのcontextを

元記事を表示

関数に可変長引数を使いたい

##はじめに
可変長引数を使った関数について、備忘録を兼ねて記載しておく

##概要
Goでは、「…」を使うことで
・関数の定義に可変長引数を使うこと
・その関数にスライスを渡すこと が可能

##可変長引数を使って任意個数の引数をとる関数を定義する
型の前に「…」を記載した(`変数名 …型`)を引数の定義を使うことで、
任意の個数の引数をとる関数を定義することができる。

“`sample.go
func sample(s string, i …int){
//処理(もちろん、iはスライスなので、rangeを使うことも可能)
}

func main(){
sample(“Hello”, 1, 2, 3, 4)
}
“`

つまり、関数定義で使う「…」には、渡ってきた可変長引数の値を 変数名x([]T型)のスライスにまとめる効果がある。

#####制約事項
可変長引数は、「引数の末尾に1つだけ」定義することができる。
→ 可変長引数は、**最後に1つだけしか書けない**

##スライスを可変長引数として渡す
変数名の後に「…」を記載

元記事を表示

go-sql-driver/mysql を用いる際に (*DB).SetConnMaxLifetime は不要なのか

# はじめに

先日、GitHub Blog にて Go の MySQL Driver に関する記事が掲載されました。
[The GitHub Blog: Three bugs in the Go MySQL Driver](https://github.blog/2020-05-20-three-bugs-in-the-go-mysql-driver/)

ここでは Three bugs のうち、最初に挙げられている `The crash` について話します。

`The crash` は、切断されたコネクションをコネクションプールから引き当てて用いた際に `unexpected EOF` が発生する問題です。
この問題に対して、今までは `(*DB).SetConnMaxLifetime` を設定することで、切断されたコネクションを再利用しないよう対処してきました。

go-sql-driver/mysql v1.5.0 では著者による修正がマージされており、記事中では `(*DB).SetConnMaxLifetime` が不要とされています。

> If your MyS

元記事を表示

OTHERカテゴリの最新記事