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

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

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快適開発環境構築方法

元記事を表示

AtCoder Regular Contest 105のメモ

# 前置き

Atcoderをやってみたので、自分用のメモです。
あとから加筆・修正する予定です。

# 問題

https://atcoder.jp/contests/arc105

# A

“`Q_A.go
package main

import (
“fmt”
)

func main() {
var a,b,c,d int
fmt.Scanf(“%d %d %d %d”, &a, &b, &c, &d)

flag := false

flag = (a == b+c+d || a+b == c+d || a+c == b+d || a+d == b+c || a+b+c == d || a+b+d == c || a+c+d == b )

var s string
if flag == true{
s = “Yes”
}else{
s = “No”
}
fmt.Printf(“%s\n”, s)
}
“`

# B
“`Q_B.go
package

元記事を表示

googleのsubcommandsでGCPのSecret Managerへの読み書きをラップ

# お題
GCPには[Secret Manager](https://cloud.google.com/secret-manager?hl=ja)というのがある。
Kubernetes知ってる人は「[Secrets](https://kubernetes.io/ja/docs/concepts/configuration/secret/)みたいなものか」思うかも。ただk8sのSecretsはBase64エンコードなので、(例えば元データの管理の名目としても)PublicなGitHubリポジトリにアップするわけにいかないけど、Secret Managerの方は暗号化されてるので(鍵を知らなければ)まさにSecret。

その他、ウリみたいなものについては以下参照。
https://cloud.google.com/blog/ja/products/identity-security/introducing-google-clouds-secret-manager

上記参考記事にも記載してあるけど、Secret Managerに限らずGCPのサービス群は[Cloud SDK](https

元記事を表示

[GoLand]コメントの先頭にスペースを設定する

# 1.はじめに
ググっても解決策(GoLandの公式ヘルプ)がなかなかヒットしなかったので書きました。
個人的にはGoLandを別のPCにインストールしたときという、たまにの機会に忘れていて結構困るためです。

## 1-1.この記事を読んだらどうなるのか
フォーマット時にコメントの先頭にスペースが自動的に入るようになって、楽になれる。

## 1-2.対象読者
GoLandでコメントの先頭にスペースを自動でいれられずに苦しんでいる人。

# 2.GoLandの設定
[こちら](https://pleiades.io/help/go/reformat-and-rearrange-code.html#configure-leading-spaces-in-comments)が公式のヘルプ
公式を引用させてもらいます。

> 1.設定ウィンドウ(ファイル | 設定)を開きます。
> 2.エディター | コード・スタイル | Goをクリックします。
> 3.その他タブをクリックします。
> 4.コメントに先行スペースを追加するチェックボックスを選択します。
> 5.コメントのスペースを除

元記事を表示

[Go]「…(ピリオド3つ)」の使い方

# 1.はじめに
これからGoを始める人のためになればと思って記事を書きました。
ソースコードで「…」を初めて見たときに、ググっても日本語で情報がまとまっているものがあまり無いので、私が業務でよく使っている「…」の使い方をまとめようとおもいました。

## 1-1.この記事を読んだらどうなるのか
「…」の使い方とポイントを理解できる

## 1-2.対象読者
Goの「…」がわからない人

# 2.「…」の使い方

## 2-1.関数のパラメータを可変長にしたいとき
関数のパラメータを可変長にすることができます。
たとえば、関数で複数のintを可変で受け取りたいときがあるとしたら、以下のように書くことができます。
ポイントは **…int** のように型の前に…を書くことです。

“`
// WriteInt はintを可変で受け取って出力する関数
func WriteInt(nums …int) {
for _, v := range nums {
fmt.Println(v)
}
}
“`

実行すると、以下の結果になります

“`
f

元記事を表示

OTHERカテゴリの最新記事