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

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

【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

##Auto Create/Update
>GORM はレコードの作成・更新時に関連および関連先を自動的に保存します。もし関連に主キーが含まれる場合、GORM は関連先の Update を保存時にコールし、そうでなければ作成します。

なるほど、他のテーブルとアソシエーション(関連)を組んでいる場合、
・関連に主キーが含まれれば:Update
・関連に主キーが含まれなければ:Create
がコールされるらしい。

ということで、以下のようなstruct(テーブル)があった場合、ど

元記事を表示

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

元記事を表示

Kubernetes APIのdeprecation/removalを事前に検出する

`apps/v1beta1 Deployment`等のKubernete APIのdeprecation/removalを検出するための方法について紹介します。

**特にKubernetes v1.16以上に移行する方々**
Kubernetes v1.16ではDaemonSetやDeploymentの古いAPIバージョン(ex. `extensions/v1beta1`, `apps/v1beta2`)がremoval対象となっているため影響が大きいです。v1.16以上のクラスタに移行する予定がある方は注意しましょう。

# 背景

Kubernetesは新しいバージョンで特定のKubernetes API(ex. apps/v1beta1 Deployment)がdeprecated/removedとなります。詳細なDeprecation Policyについては[公式ドキュメント](https://kubernetes.io/docs/reference/using-api/deprecation-policy/)を参照してください。

Kubernetesでは各リソースのAPI

元記事を表示

【Go】メソッド=関数でしょ?と考えてきちんと躓く

# メソッド = 関数でしょ?

なんででしょう。なんとなくこういう感覚でした。
**もちろん違いますね。オブジェクト指向をきちんと勉強しましょうね(自戒)**

とりあえず、一歩前進して以下の解釈になりました。

## 関数とは

[IT用語辞典 — 関数 【 function 】 ファンクション](http://e-words.jp/w/%E9%96%A2%E6%95%B0.html)

> 関数とは、コンピュータプログラム上で定義されるサブルーチンの一種で、数学の関数のように与えられた値(引数)を元に何らかの計算や処理を行い、結果を呼び出し元に返すもののこと。

うん。こちらの意味は想像と一致してました。

## メソッドとは

[IT用語辞典 — メソッド 【 method 】 メンバ関数](http://e-words.jp/w/%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89.html)

> オブジェクト指向ではデータと手続きをオブジェクトとして一体化(カプセル化)して定義、利用する。この、オブジェクトに内包された手続き(データに対す

元記事を表示

【Golang】構造体③埋め込み

#【Golang】構造体③埋め込み

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

“`
//Embedded
//クラスの継承のイメージ
//埋め込み

//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

class Vertex3D(Vertex):

def __init__(self, x, y, z):
super().__init__(x, y)
self._z = z

def area_3d(self):

元記事を表示

【Golang】構造体②メソッド

#【Golang】構造体②メソッド
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

“`
package main
//メソッドとポインタレシーバーと値レシーバー
//メソッド class内関数のselfを使えるようなイメージ(Goにはクラスが無い)
//コードがわかりやすい

import (
“fmt”
)

//バーテックスを作成
type Vertex struct {
X, Y int
}

//1
func Scale1(v *Vertex, i int) {
v.X = v.X * i
v.Y = v.Y * i
}

//2
//メソッド
func (v Vertex) Area() int {
return v.X * v.Y
}

//メソッド
//structのポインタを渡す 値を上書きする
//原則ポインタ型にする
//引数も渡す
func (v *Vertex) Scale2(i int) {
v.X = v.X * i
v.Y = v.Y * i
}

fun

元記事を表示

Go製のToolをHaskellで実装する

# 初めに

最近Haskellの学習としてGo製のToolをHaskellで実装するようにしています。

Haskellでなにかしら作りたいと考えていて、そういえばGo製のToolはよく作られているから面白そうなものありそうだなと思ったのがきっかけです。

mockサーバであるhttplabをHaskellで作ることにしました。

まだ100%の実装ができていないのですが、ある程度形ができたので記事を書くことにしました。

![screeencast.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217752/bd2e51db-1a92-a530-ec8c-75c9bf2718e6.gif)

ソースコードは[こちら](https://github.com/kwhrstr/httplabkell)にあります。

Haskellでbrickというライブラリを使っていますが、使い方等は[以前書いた記事](https://qiita.com/kwhrstr1206/items/25acf6eb3c43f

元記事を表示

GoでGoogle Maps APIを使って場所の詳細情報を取得する(例:東京タワー)

# はじめに
GoでGoogleMapsAPIを使った記事があまりなかったので書いてみました。
GoogleMapsAPIには様々なAPIがあるのですが、今回は[Place](https://cloud.google.com/maps-platform/places?hl=ja)というAPIを使ってみたいと思います!

Placeの詳細情報はこちら。
[Overview | Places API](https://developers.google.com/places/web-service/intro)

# GCPで事前準備
GoogleMapsAPIを使うにはGCPのアカウント作成、プロジェクト作成、APIKEYの取得が必要です。

以下からこれらを作成します。
[Google Cloud Platform](https://cloud.google.com/docs?hl=ja)

詳しい手順はこちらが参考になります。
[Google Maps Platform APIキーの取得・発行について](https://www.zenrin-datacom.net/business/

元記事を表示

OTHERカテゴリの最新記事