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

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

【Golang】ゴルーチン③バッファ、チャネル

#【Golang】ゴルーチン③バッファ、チャネル
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

“`
package main
//Buffered Channels
//同じチャネルに複数ゴルーチンから送信

import “fmt”

func main() {
//1
//channelを作成 2はバッファ 2つまで受け取る。長さ
//3つあるとエラーになる
ch := make(chan int, 2)
ch <- 1000 fmt.Println(len(ch)) //>>1

ch <- 2000 fmt.Println(len(ch)) //>>2

//ch <- 300はバッファサイズ以上になる為、エラー(デッドロック) //2 //一つ取り出す。channelの中は1つ減るため、追加できる /* x := <- ch fmt.Println(x) ch <- 3000 */ //3 //forで取り出す //2つ以上取りに行くため、エラ

元記事を表示

Cloud FunctionsのHTTPトリガーをGolang + Echoでさばいてみた

GCPのCloud FunctionsのHTTPトリガーをGolangで使っているときにEcho使えるんじゃないかと思って試したメモです。

# プロジェクト構成
Cloud Functionsで使えるように以下のようにファイルとディレクトリを作成します。

“`
プロジェクトルート/
├── cmd
│   └── main.go
├── functions.go
├── go.mod
├── go.sum
└── shared
└── echo.go
“`

## コード
### go.mod
使った依存ライブラリはこんな感じです。

“`
module github.com/sert-uw/go_echo_functions

go 1.13

require (
github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect
github.com/labstack/echo v3.3.10+incompatible
github.com/labstack/gommon v0.3.0 // indirec

元記事を表示

gobot I2CでLチカ

#1.はじめに

goと[gobot](https://gobot.io/)を使って、RaspberryPiのI2Cに接続したIOエキスパンダ(MCP23017)を操作してみます。

[公式にMCP23017がサポート](https://gobot.io/documentation/drivers/mcp23017/)されてるので、チュートリアルチャレンジで終わるかと思ったら、なんと、サンプルコードが書かれてなかったので、覚え書きを兼ねて簡単にまとめてみました。

**実行環境**

| | |
|:–|:–|
|ハードウェア|Raspberry Pi 4 |
|OS|Raspbian Buster|
|go|Ver.1.14.3|
|||
|IOエキスパンダ|[MCP23017](http://akizukidenshi.com/catalog/g/gI-09486/)|
||→これを、RaspberryPiのI2C端子に接続済|

“`bash
$ uname -a
Linux raspi4 4.19.97-v7l+ #1294 SMP Thu Jan 30 13:21:14

元記事を表示

aws-sdk-goを通してlocal-kmsを使う

# この記事を書いた経緯
aws-sdk-goを用いた案件ソース中にkmsを用いた暗号・復号化の実装があり
kmsという概念すらわからなかった私が、ローカル環境での検証に四苦八苦した時の覚書を認めたものです

# コマンドだけ知りたい人へ
## local-kmsコンテナを立ち上げる
**そのままdev環境・本番環境のKMSに作られている鍵を使おうとしても、IAMの認証をかけられてしまうので
権限のないローカル環境では暗号化・復号操作を行うことができません。**

ローカル環境においてkmsを用いた処理をデバッグしたい場合、[local-kms](https://hub.docker.com/r/nsmithuk/local-kms)というdocker imageを用いて実現することが可能です。
他コンテナとポートが重複する場合は、環境変数“PORT“を用いることで競合を回避できます

“`bash
$ docker run -p 8080:8081 -e PORT=8081 nsmithuk/local-kms
“`

## aws configureの作成
local-k

元記事を表示

git で日記を管理したい

# 要約
git で日記をいい感じに管理したいという思いを込めて日記管理用の cli ツールを作成いたしました。
https://github.com/komem3/go-diary

# 背景
バージョン管理やリモートリポジトリを使って日記・日報を管理したいという思いが有りましたが、いかんせんディレクトリが汚くなってしまうのが問題でした。定期的にディレクトリを綺麗に整理する根気があれば良いのですが、三日坊主になりやすい私なんかはそれだけで日記を書くのが嫌になってしまいます。
そこで、日記のファイルをいい感じのディレクトリ構造で管理するツールを作成しました。

# インストール
go で作成したツールのため、以下のようにダウンロードしていただきます。

“`sh
go get github.com/komem3/diary/cmd/diary
“`

# 使い方
“`sh
$ diary -h
Diary is a CLI libray for managing your diary.
This application can format your diary director

元記事を表示

「Golang」 ×「Gorm」でシンプルに「Mysql」を操作する

「`REST API`サーバから受け取ったリクエストパラメータの内容を元にリレーショナルデータベース(`Mysql`)を更新する」という流れで、説明を進めています。

以下の記事の続編という形で投稿を行っておりますので、仕様などの前提条件はこちらで確認していただけるとありがたいです。

> [「Golang」 ×「gorilla/mux router」でシンプルなREST APIサーバーを開発する](https://qiita.com/stranger1989/items/7d95778d26d34fd1ddef)

# データベース(Mysql)準備

コードを実装する前に、`Mysql`上でデータベースの作成を行います。
※ `Mysql`自体導入していない場合は、インストールが必要です。詳細は他のサイトで解説されているのでここでは割愛します。

“`shell
# ルートユーザーでログイン
mysql -uroot

# mysql shell上
CREATE DATABASE { データベース名 };

#

元記事を表示

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 ランタイム部分を参考にして作成したもので、 Windows タイムゾーンをどの OS や実行環境でも扱えるようにするためのライブラリです。これを使うと、例えば `Tokyo Standard Time` のような Windows 独自のタイムゾーン

元記事を表示

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() ```

元記事を表示

OTHERカテゴリの最新記事