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

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

Db2コンテナをGoで操作する

こんにちは。
今回はDockerで立てたDb2コンテナをGoで操作する方法について紹介します。
Db2コンテナの立て方や、セットアップ時にデータを挿入する方法については、以下の記事で紹介しておりますので、ぜひ参考にしてください。

[Db2のDBコンテナを立ててちょっとしたデータを挿入してみる](https://qiita.com/rikkyrice/items/fdf45eeba6f1ddb5353d)
[Db2/DBコンテナに初期テストデータを挿入した状態でセットアップ](https://qiita.com/rikkyrice/items/20946fc5b4e2153b0f87)

今回は、Db2コンテナをデータを挿入した状態で立ち上げ、Goでの実装を中心に紹介します。

コード類は[こちら](https://github.com/rikkyrice/connect-go-and-db2)に載せています。

## 概要
Db2コンテナにデータは挿入できたけど、実際にそのデータを取得してきて操作したり、データを更新したりするにはどうするんだという方向けの内容となっています。

今回

元記事を表示

値を二つの方法でトグルするAPIの実装(go)

## やること

GoのwebフレームワークEchoになれるために練習するのが目的です。値をトグルするとは言っても、データベースのbool値をtrue<=>falseにする場合と、データベースのレコードをInsertしたりDeleteする場合(中間テーブルを使ってお気に入り機能を作るとか)があると思う。今回は、BoolTogglerモデルとして前者の実装をした後、UserモデルにBoolTogglerに対するのお気に入り機能をつけて後者を実装して行きます。(シュールで実用性に欠けるアプリケーションですが練習なので気にしないことにします…)
[GitHubにてコード全体を乗せています。](https://github.com/ngplus6655/example_echo_toggler_api)

## DBのbool値をトグルするAPI

### models

この記事の本題1です。モデルのbool型の列の値のTrue<=>Falseをトグルします。
こんなモデルを定義してマイグレーションしました。

models/bool_toggler.go

“`go
packag

元記事を表示

Firestoreを介して画面操作毎の登録内容を別システムに時系列で連携

# 想定する読者
– GCPについては知っている。
– [Firestore](https://cloud.google.com/firestore?hl=ja)(ないし[Datastore](https://cloud.google.com/datastore?hl=ja))を使ったことがある。ないし、おおよそどういうものかは知っている。
– Golangもそれなりに書ける。

# お題
何かしらの情報に関して登録・更新・参照する、ごくごく普通のWebアプリケーションがあったとして、画面で操作した内容を自システムのDBに保存すると同時に、`操作した順序を保って`別システムにも反映したいという要件があったとする。
別システムでは機能ごとにデータ反映用のAPIを提供しているので、それを叩けばよいのだけど、問題は1つ1つのAPIが重い(=要するにリクエスト受けてからレスポンスまでの時間が5秒以上かかる)ということ。
したがって、単純に考えて、画面で操作した流れでそのままAPIを同期的に叩くというわけにはいかない。
(そんなことをしたら、ユーザが何かの情報を登録・更新するたびに7〜8秒くらい

元記事を表示

GolangでCloudFrontのキャッシュを削除する

S3の画像をCloudFrontで流しているのですが、画像更新時にはキャッシュ(エッジサーバー上のキャッシュ)をクリアしたいなと思い、やり方を調べました。

## Goで実装する
Golangで実装するには、AWS SDK GoのCloudFront周りの機能を使います。
公式はこちら: [cloudfront – Amazon Web Services – Go SDK](https://docs.aws.amazon.com/sdk-for-go/api/service/cloudfront/)

このSDKの `CreateInvalidation` というメソッドを使います。
実装としては以下の感じです。

“`go
const (
// CloudFrontのID
CloudFrontID = “HOGEHOGE”

//cloudfrontでキャッシュ削除するパス
ClearTargetPath := “/*”
)

func ClearCache() error {
svc := cloudfront.New(session.New())
jstNow :=

元記事を表示

Goでベジェ曲線の描画

# Goでベジェ曲線の描画

細かい解説もしたいですが、ひとまずソースコード

## ソースコード

“`go
package bezier

import (
“math”
)

type Point struct{
X,Y float64
}

// n! (nの階乗)
func factorial(n int)(int){
if n == 0{
return 1
}
return n * factorial(n-1)
}

func biCoe(n,i int)(float64){
return float64(factorial(n) / (factorial(n-i) * factorial(i)))
}

func bernstein(n,i int,t float64)(float64){
var N float64 = float64(n)
var I float64 = float64(i)
return biCoe(n,i) * math.Pow(t,I ) * math.Pow(1-t,N-I)
}

func Bez

元記事を表示

ebitenを使ったシンプルな時計を描画するサンプル

# ただシンプルな時計を描画するだけのプログラム

[ebiten](https://github.com/hajimehoshi/ebiten) というゲームエンジンを使って、時計を描画するサンプル

![時計のイメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618332/e31cb714-4412-bf93-403f-ad688a4f3fb9.png)

時計はとにかくシンプルなもの。

## ソースコード

“`main.go

package main

import (
. “clock”
“github.com/hajimehoshi/ebiten”
“github.com/hajimehoshi/ebiten/inpututil”
“log”
“time”
)

type Game struct {
time time.Time
stop bool
}

func (g *Game) Update(screen *ebiten.Image) error {
if inp

元記事を表示

Goでデータベースの内容を取得する関数を作る

データベースから目的の内容を全て取る関数について今から書きます。すでにデータベースには、なにか入っている状態でします

[interface{} な変数を型が決まっている関数の引数にする](https://qiita.com/umanoda/items/07887d33ef1155b26ed2)
[「Golang」 ×「Gorm」でシンプルに「Mysql」を操作する](https://qiita.com/stranger1989/items/914bef8cc6ad77ef8350)
[【go + gin + gorm】webアプリにログイン機能を追加してみる](https://qiita.com/dai-maru/items/f7cdd22baf3425a1722d)
[Goでの Mysql接続から構造体へのデータ割り当てまで](https://qiita.com/rihofujino/items/c17a006101374b200c1b)
[Gin と GORM で作るオレオレ構成 API](https://qiita.com/Asuforce/items/0bde8cabb3

元記事を表示

LambdaでGoを動かす① -Serverless-offlineを起動するまで-

# はじめに
最近Goの面白さを知ったので、簡単なWeb開発を通して文法を学んでいく。
またGoって、Lambdaと相性良さそうだなと感じたので、そこらへんでの利用を考えてみる。

## 目的
LambdaでGoを動かすとすると、どんな感じかを確かめる。
デプロイするのは手間なので、serverless-offlineを用いて、ローカルでLambdaやAPI Gatewayを再現する。
今回は環境構築まで。

# 環境構築
serverlessのGoテンプレートは3種類あります。aws-go-modで開発が進んでいるようなので、こちらを利用します。

“`bash
$ sls create –template aws-go-mod –path gochats
Serverless: Generating boilerplate…
Serverless: Generating boilerplate in “/Users/apple/gochats”
_______ __
| _ .—–.—-.–.-

元記事を表示

grpc_zapで簡単シンプルにgRPCの構造化ログを実装してみる

# はじめに
チーム内でgRPCを採用し開発を進めていますが、
まだまだ日本語の記事も少なく、とくにログの実装については詳細な記事が
なかなか見つからなく、情報収集に時間がかかりました。。
そのため、チームへの情報共有と自分の備忘録ついでに記事にしたいと思います。

今回はGo言語によるgRPCサーバ開発を進める中で、
高速なログ出力ができ、grpc-middlewareに組み込まれている
`grpc_zap`を使って簡単シンプルな構造化ログを実装してみます。
なお、今回の記事ではgRPCの概要や仕組みについては触れていません。

## grpc_zapとは
UberがOSSで提供している`zap`Loggerを利用し、gRPCに組み込めるよう
Interceptorの一つとしてgrpc-middlewareに組み込まれているパッケージです。
zapの構造化ログが簡単に実装でき、`grpc_ctxtags`と組み合わせることで、
自由にフィールドを追加することができます。

## サンプルと動作環境
GitHubリポジトリにて[サンプル](https://github.com/y-ha

元記事を表示

【golang】構造体のint型のフィールドのjsonタグにomitemptyをつけて、0が入った場合に無視するようにしたい

# はじめに

golangで、構造体のint型のフィールドの値が0のとき、jsonを無視させたい。

言い換えれば、int型のフィールドのjsonのタグに“omitempty“を指定したときに、そのフィールドの値に“0“が入ってきた場合に、無視させたい。

**※追記**
**実際には「無視」というよりも、それを「nullにする」という表現のほうが適切かと**

# “omitempty“

構造体のフィールドが空のときに、jsonを無視する方法はわかった

“`golang
type User struct {
Name string `json:”name, omitempty”`
Age int64 `json:”age, omitempty”`
}
“`

しかし、“omitempty“では数値型は、“0“が入っても無視できない。

# 解決策

そこで、数値型のフィールドをポインタにして、無視したい場合は、ポインタにnilをいれる方針にすれば解決した。

“`golang

// User構造体
type User struct {

元記事を表示

Goのnet/httpパッケージでHello WorldするだけのWebアプリ

# Goの目覚め
低レイヤーの知識を身につけて、さいつよ自給自足エンジニアになるぞ!
…と意気込みC言語を学んでみたものの面白さが見出せなかった自身へ送る。

## ペルソナ
Webアプリを作りたいなら、現状NodeやRailsで十分と思ってる。
デスクトップアプリなら、Electronで。
ターミナルアプリとか、OSの機能を使うぜ系でGoとか使ってみたいなぁと思ってる方 (最近流行りのDockerやGitHub CLIもGo製だし、使えれば遊べそう)。

## 本記事の目的
Goを学ぼうかどうか判断するために、簡単なWebアプリを作ってみます (アクセスしたら、Hello Worldと表示するだけ)。

# 開発環境
Goを信用して良いのか分からなかったので、環境を汚さないために、Dockerでやります。
面白かったら、デバッカーとかで内部まで見たいので、ローカルで環境構築します。

ディレクトリ構成は以下のようにしました。
compileFileディレクトリ内にgoファイルを置いて、ビルドしていきます。

“`
compileFile (ディレクトリ)
Dockerfil

元記事を表示

【Golang】mapのvalueに配列を指定する

## 概要

mapの中にvalueに配列をいれるみたいなのをGoでしたかったので自分用メモ

## 実装

“`go
package main

import “fmt”

type Hoge struct {
Say string
}

func main() {
a := map[string][]Hoge{}
a[“hoge”] = append(a[“hoge”], Hoge{Say: “hello1”})
a[“hoge”] = append(a[“hoge”], Hoge{Say: “hello2”})
a[“hoge1”] = append(a[“hoge1”], Hoge{Say: “hello3”})
fmt.Println(a)
}
“`

上記をgo runすると

“`
map[hoge:[{hello1} {hello2}] hoge1:[{hello3}]]
“`

のようにmapのvalueの中にarrayが入ります

元記事を表示

golang profiling

参考資料をメモするだけ
—-
– https://github.com/adjust/go-wrk
– https://golang.org/pkg/net/http/pprof/
– https://github.com/uber-archive/go-torch (すでにGo1.11から含まれてる)

# Video
– GopherCon 2019: Dave Cheney – Two Go Programs, Three Different Profiling Techniques https://youtu.be/nok0aYiGiYA
– Profiling and Optimizing Go(古いけど) https://youtu.be/N3PWzBeLX2M

元記事を表示

Cloud Pub/Subの「メッセージの順序指定」によりFIFOキューが実現できるのか?

# お題
[Cloud Pub/Sub](https://cloud.google.com/pubsub?hl=ja)使ってますか?
大量のメッセージを捌きたい時に使いますね。
これ、メッセージ投入時の順序、保証したい時、ないですか?
AWSの場合であればSQSの[FIFOキュー](https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html)を使うのかなと思います。
(過去に使おうとしたことがあったものの、まだ東京リージョンなかったのと1秒に最大3000メッセージという制約に尻込みして、結局使わなかった記憶が。。。)
SQSに相当するといったらGCPではCloud Pub/Subだと思いますが、残念ながらFIFOキューは無い。
と思っていたら、
(Beta版ですが)「[メッセージの順序指定](https://cloud.google.com/pubsub/docs/ordering?hl=ja)」という機能が出来ていたようで。
これで、メッセージがPu

元記事を表示

goのgqlgenでgqlgenコマンドが効かない

# 事象

– goでGraphQLを実装するのにgqlgenを使っていた
– https://github.com/99designs/gqlgen
– READMEに書いてあるコマンド `go run github.com/99designs/gqlgen [args]`が実行できたり、できなかったりした

# 発生条件
– go.modファイルに書いてあるgoのバージョンが1.12以下の人はおそらくREADME通りにやっても動作する
– go.modファイルに書いてあるgoのバージョンが1.13以上の人は`go mod vendor`後に実行するとおそらくエラーになる

# 対処方法
– `go get github.com/99designs/gqlgen`した段階でおそらく`$GOPATH/bin/gqlgen`が生成されているはず
– `gqlgen [args]`で実行できる。(`$GOPATH/bin`にパスが通っているはず)

# 最後に
– go run [package]は、実行する場所($GOPATH内かそうではないか)、go.modのバージョン、./vendo

元記事を表示

【続】tcpの仕様上、接続先がコネクションをcloseしているかはパケットを一度は実際に送るまでわからないよという話

# はじめに
以前、[tcpの仕様上、接続先がコネクションをcloseしているかはパケットを一度は実際に送るまでわからないよという話](https://qiita.com/behiron/items/3719430e12cb770980f3)という記事をかいたのですが、そのきっかけは

> 以前、アプリからDBにSQLを投げたところ、コネクションがinvalidだというエラーが起きました。この原因自体はとても簡単でサーバ側(DB側)のコネクションを保持するタイムアウト設定がクライアントよりも短かったというだけなのですが、「これってクライアントライブラリ側でソケットにwriteした時点でエラーになるんだからハンドリングしてコネクションプールに保持している他のコネクションをよしなに使ってよ!!」と思ったのでした。

でした。

これは[goのmysqlドライバー](https://github.com/go-sql-driver/mysql)を利用した場合に発生していたのですが、まさにこの問題をGitHubの中の人が去年に修正しており、それをテーマに[ブログ](https://github

元記事を表示

Golangのflagパッケージの使い方(最小限の知識)

flagパッケージはコマンドラインのフラグを解析するのに便利なパッケージです。

## flagパッケージをインポートする
“`go
import “flag”
“`

## フラグの値を格納する変数を定義する

### 関数外で定義する場合の書き方
後述するinit()のXxxVar()で変数にバインドする場合はフラグを格納するための変数を用意する。

“`go
var boolFlag bool
var intFlag int
var strFlag string
“`

### 関数内で定義する書き方
後述するinit()のXxxVar()で変数にバインドしなかった場合はポインタとなる。

“`go
boolPtr := flag.Bool(“b”, false, “真偽値の値の例”)
intPtr := flag.Int(“i”, 0, “数値の場合の例”)
strPtr := flag.String(“s”, “”, “文字列の場合の例”)
“`

## フラグの初期化
init() はmain()が呼ばれる前に実行される。
main内に記述したfl

元記事を表示

Golangのerrorとpanic

#### The art of programing
業務ロジックにエラーブロックが沢山の場合がよく見られる
例えば以下の関数を順次に呼ぶ

“` go
func first() error {return nil}
func second() error {return nil}
func third() error {return nil}
func fourth() error {return nil}
func fifth() error {return nil}
“`

**error**を判断する書き方は、
なに?眩暈しちゃった。。。

“` go
func Do() error {
var err error
if err = first(); err == nil {
if err = second(); err == nil {
if err = third(); err == nil {
if err = fourth(); err == nil {

元記事を表示

Qiita APIをgoから叩いてみた

## はじめに
Go言語を勉強しなければという使命感にかられ、遊んでみることにしました。

## golang + Qiita API
### 環境
・ go version go1.13 darwin/amd64

### URIと機能
|Path |HTTPメソッド |機能 |
|—|—|—|
|/qiita/api/v1/user-info | GET |指定されたユーザの記事一覧を、作成日時の降順で返します。 |

### 使用パッケージ
**・ gin**
ginは、go製のWebフレームワークです。jsonレスポンス処理機能も持っている優れものです。

“`
go get github.com/gin-gonic/gin
“`

### ファイル構成

“`
❯ tree .
.
├── main.go
└── src
└── controller
└── controller.go

2 directories, 2 files
“`

### controller
mainから呼び出すタスク処理をまとめています。

`

元記事を表示

golandとDocker設定

# golandを使う人への参考記事まとめです。

## GolandでDockerを使う
[Docker – 公式ヘルプ | GoLand](https://pleiades.io/help/go/docker.html#using-docker-compose)
公式ページ。これだけでもいい人もいるはず。日本語が少し不自然。

[GolandでDocker上のサーバーをRemote Debug – Qiita](https://qiita.com/edelweiss452/items/2013b6f34be8ab6d4abd)
リモートデバッグの解説が日本語で書かれていて読みやすい。

[Docker上のGo製Webアプリケーションをリモートデバッグする – Qiita](https://qiita.com/keitakn/items/f46347f871083356149b#docker-compose%E3%81%AE%E8%A8%AD%E5%AE%9A)
実際に使用しているコードがわかります。

## golandの設定
[GoglandでオススメのGo快適開発環境構築方法

元記事を表示

OTHERカテゴリの最新記事