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

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

Docker環境のgRPC/goでハローワールド

# はじめに
goのお勉強しはじめた。gRPCのお勉強しはじめた。まず、これを試してみた。
思ったより、つまづいたので記録を残しておく。
[Quick start – gRPC](https://grpc.io/docs/languages/go/quickstart/)

goもgRPCもよくわかってない。

環境は、このdockerイメージを使った。名前的に、欲しいの入ってそうやったので。
[grpc/go – Docker Hub](https://hub.docker.com/r/grpc/go)

# Docker
こんな感じで立ち上げた。Dockerよくわからん 。

“`
docker pull grpc/go
docker run –name grpc-go -it grpc/go /bin/bash
“`

# Quick Start
Quick Startにそって順番に実行していく。

下記コマンドを実行すると、

“`
$ go run greeter_server/main.go
“`

こんな感じのエラーが出る。

“`
cannot find

元記事を表示

Goで排他制御の仕組みを作ってみた

#概要
エンジニア1年目、2度目の投稿です。
Goで排他制御の仕組みを書く機会があったので、記録していきます。
今回は2種類の方法で排他制御の仕組みを作っていきます。

#各種ツール
– go 1.14
– VSCode(1.50.1)
– golang.org/x/sync v0.0.0-20201020160332

#シナリオ
今回はあるテーブルを共有資源として、テーブルに対して複数のプロセスから処理が行われたときに、先行のプロセスが終わるまで、後続のプロセスがテーブルを操作することが出来ないようにする仕組みを作っていきます。

まずは排他制御を行わず、ゴルーチンをつかって同時にテーブルをupdateしてみます。
(sync.WaitGroupはメインのgoroutineを待機させるためのものです。詳しくは[こちら。](https://qiita.com/ruiu/items/dba58f7b03a9a2ffad65))

“` go
var w sync.WaitGroup

func main() {
w.Add(2)
go update()
go update()

元記事を表示

[GKE] Deploymentのreplicasを0にしてGoアプリにOSシグナル SIGTERM を通知

# お題
表題の通り。
実際の動きとしてそうなることを確認したかっただけ。

# 前提
– GCP環境は用意済み。
– GCPローカル設定済み。(`gcloud`コマンドが使用できる状態になっている。)
– `kubectl`コマンドが使用できる状態になっている。
– GKEクラスタ作成済み。

# 開発環境
## # OS – Linux(Ubuntu)
“`
$ cat /etc/os-release
NAME=”Ubuntu”
VERSION=”18.04.5 LTS (Bionic Beaver)”
“`

## # gcloud
“`
$ gcloud version
Google Cloud SDK 312.0.0
“`

## # kubectl
“`
$ kubectl version
Client Version: version.Info{Major:”1″, Minor:”17″, GitVersion:”v1.17.9″, GitCommit:”4fb7ed12476d57b8437ada90b4f93b17ffaeed99″, GitTreeSta

元記事を表示

Go を docker で動かす時の tips

## docker image

### go mod を利用するパターンの参考
“`dockerfile
# buildイメージ
FROM golang:1.13 AS builder

WORKDIR /go/src

## 依存ライブラリをダウンロードする(キャッシュを使いたいので、これを先にやる)
ENV GO111MODULE=on
COPY go.mod go.sum ./
RUN go mod download

ADD . /myapp
WORKDIR /myapp

## main.goをコンパイルし、実行バイナリを保存
RUN CGO_ENABLED=0 GOOS=linux go build -o server ../myapp/cmd/main.go

# run-timeイメージ
FROM alpine:3.10
COPY –from=builder /myapp/server /app
EXPOSE 50051
ENTRYPOINT [“/app”]
“`

### dep を利用するパターンの参考
“`dockerfile
# buildイメージ

元記事を表示

anyenvのgoenvにGoLangをインストール

突如業務でGo言語、GoLangを使うことになる可能性が出てきたので、勉強を始めようと思いました。
せっかくなので環境作りを控えておきます。どなたかの役に立つと幸いです。

## 環境

HARD: MBP2015
OS: macOS Catalina 10.15.7

## anyenvのインストール

多言語でもよくよく出てくる言語のバージョン管理ツールですが、GoLang版もあり、 `goenv` となります。色々試そうとするとバージョン管理ツールが山程溜まってくるので、ここは `anyenv` を使って一元管理しましょう。後から導入しようとすると、pathを通したりするので大変なことになります…。
`anyenv` のインストール手順については、調べると山程出てくるので、そちらを参照してください。

参考: [anyenv + macOS環境構築](https://qiita.com/rinpa/items/81766cd6a7b23dea9f3c)

“`
$ anyenv install -l
Renv
crenv
denv
erlenv
exenv

元記事を表示

docker containerの挙動が変わらなくて困った

#はじめに
コードを変更しても、コンテナ内のアプリの挙動が変わらなくて、困ったことになっていました。その対処法についてのメモです。(キャッシュが効いていた系ではない)

#先に対処法
`Dockerfile`内でbuildした`app`(実行ファイル)を、`docker-compose.yml`で設定していたvolumesのローカルディレクトリ内にあった`app`が上書きしてました。
よって、余計なマウントをしないように変更することで解決しました。

#Problem
1. dockerコンテナで作成していたgolangのアプリがある
2. `Dockerfile`内でbuidしてappを起動するようにしている
3. 例えば、`main.go`を編集して保存する。
4. `docker-compose up -d –build` でアプリを再作成・起動する
5. あれ?変更されてないぞ!?(buildは実行されている)
6. `docker-compose build –no-cache` を試すが同じ…

ディレクトリ構成↓

“`
myapp
– docker-comp

元記事を表示

Goの制御構文について

Goの制御構文は、非常にシンプルにデザインされており、最低限の予約語で記述できるようになっています。そのため、記述方法にはたくさんのバリエーションがあるので、それについてまとめていきます。

##if文
まず、条件分岐を制御する**if文**です。if文の基本形は下記の通りです。

“`
if 条件式 {
条件成立時の処理
} else if 条件式 {
最初の条件式が成立しなかった場合の処理
} else {
すべての条件式が成立しなかった場合の処理
}
“`

ちなみに、条件式はbool値である必要があります。

##簡易文を設定したif文
条件式の前をセミコロンで区切り、簡易文を設定することができます。

“`go
x, y := 5, 10

if a := x * y; a == 50 {
fmt.Println(“変数aは50です”)
} else {
fmt.Println(“変数aは謎です”)
} //変数aは50です
“`

また、if文を利用してエラー処理も実現できます。

“`go
import (
“os”

元記事を表示

Goのグローバル変数とスコープでハマった話

グローバル変数使わないといけないときってありますよね。たとえば、テストのときの初期化に必要ですよね(今回はこれでハマった)
あとで私がハマった現実的なシチュエーションを説明します(たぶん、同じことでハマった人100人くらいはいる)がひとまずクイズ形式で気楽にいきましょう。

## クイズ
皆さんは以下のmain関数の出力は何だと思いますか?

“`go
package main

import (
“fmt”
)

var global string

func main(){
global = “initial state”
fmt.Println(global)
}
“`
「馬鹿にしてるのか?」という声が聞こえてきそうですね。
念のため答えは

“`console
initial state
“`
です。
じゃあ、次はこちらです。(次からimportとかは省きます)答えを予想してくださいね?

“`go
var global string

func main(){
global = “initial state”
global ,err := double(

元記事を表示

【Go】CloudFrontの署名付きURLでプライベートコンテンツを配信

Golangで署名付きURLを発行します。

“`golang

import sign “github.com/aws/aws-sdk-go/service/cloudfront/sign”

func main() {

type CFConfig struct {
KeyID string
Domain string
KeyPath string
}

// cloud front config
cfConf := &model.CFConfig{
KeyID: “xxxxxxxxxxxxCQ”
Domain: “http://xxx.cloudfront.net”,
KeyPath: “key/xxxxxxxxxxxxCQ”,
}

privKey, err := sign.LoadPEMPrivKeyFile(r.cfConf.KeyPath)
if err != nil {
log.Println(“failed to load pem file:”, err)
return “”, err
}

keyID := r.cfCon

元記事を表示

Fluentdのhttpアウトプットを調査してみた

この投稿では、Fluendのhttpアウトプットプラグインについて調査した結果についてお伝えします。

## Fluentdのhttpアウトプットプラグインとは?

Fluentdではアウトプットプラグインを設定することで、ログの送信先をファイルやElasticsearchなどさまざまなストレージに送信できます。httpアウトプットプラグインもその一種ですが、送信先のミドルウェアが決まっているものではなく、HTTPリクエストを受け取れるミドルウェアならどんなものに送信できる万能選手です。httpアウトプットを使うと、Webhook的なことができます。受け取る側のHTTPサーバーはどんな言語で実装しても構わないので、ログを受け取ったら任意の処理を行うことができます。

* 公式ドキュメント: https://docs.fluentd.org/output/http

## out_httpがビルトインになったのはv1.7.0

Fluentdでout_httpがビルトイン、つまり、プラグインをインストールしなくても使えるようになったのはv1.7.0からです。

Docker Hubで公開

元記事を表示

GO言語+ginでテストを書く

##はじめに
とりあえず[sourcegraph.com/github](https://sourcegraph.com/github.com/gin-gonic/gin@8f3047814e86442c8efbd91ef7007905d47cf6c9/-/blob/context_test.go#L517)をみてください。この記事は、先程みてもらったコードの一部を紹介します。
golang+ginで簡単なテストを書いてみます。
テストは難しい
##参考にしたもの
+ ginに書いてあるテストを真似して書きました。
[sourcegraph.com/github](https://sourcegraph.com/github.com/gin-gonic/gin@8f3047814e86442c8efbd91ef7007905d47cf6c9/-/blob/context_test.go#L517)

+ 公式  
[GoDoc](https://godoc.org/github.com/gin-gonic/gin)

##環境
go version go1.13.8 linux/amd

元記事を表示

GoでCRUDアプリをMysql、GORM、Echo、Clean Architectureで作る

#はじめに

本記事では `Clean Architecture` で、
DBは `Mysql` 、フレームワークは `Echo` 、ORMapperには `GORM` を用いて
`CR(U)D機能を持つAPI` 作っていきます。

### 作るもの

Create、Read、(Update)、Delete機能を持つAPI
Updateだけ未実装ですので、ぜひご自身で追加してみてください!

### 対象読者

Goの環境構築まで終えて、簡単なAPIを作ってみたい人

### 使用技術

|技術 |種類 |
|—|—|
|DB |Mysql |
|ORM |GORM |
|フレームワーク |Echo |

# 目次

# Clean Architectureとは

Clean Architectureというと、以下の図が大変有名です。

![clean.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633802/b785a780-20e9-96ae-52ae-597a7

元記事を表示

AtCoder Beginner Contest 181のメモ

# 前置き

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

# 問題

https://atcoder.jp/contests/abc181

# A

“`Q_A.go
package main

import (
“fmt”
)

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

if n % 2 == 0{
fmt.Printf(“White”)
}else{
fmt.Printf(“Black”)
}

}
“`

# B
“`Q_B.go
package main

import (
“fmt”
)

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

var a, b int64
var result int64
for i := 0; i < n; i++ { fmt.Scanf("%d %d", &a, &b) result +

元記事を表示

Goで双方向リストをJSONに変換する際のつまずき

# 何があったか
Goでコーディング中、双方向リストっぽいものを自作&JSONに変換する必要性があった。方針としては `encoding/json` を使っていくつもりが、ごちゃごちゃ詰まってしまった、という話。

# 要するに
* structに自分自身がいるときはちゃんとポインタにしましょう
* JSONに変換するとき、そいつが循環する可能性があるなら、`json:”-“` で無視させて、阻止しておこうね

# structに自分自身がいると invalid recursive type

当たり前っちゃ当たり前の話ですが。

## 失敗編

“`golang
package main

import (
“encoding/json”
“fmt”
“log”
)

type Person struct {
Name string
Parent Person
Child Person
}

func main() {
sora := Person{}
sora.Name = “Sora Amamiya”
j, err := json.Marshal(sor

元記事を表示

GORM バージョン2の変更点

# 前書

2020年8月、GORMのv2.0がリリースされました。
変更点が多くて、一部の関数でv1と互換性がないため、この記事で取り上げてみたいと思います。
[change log link](https://gorm.io/docs/changelog.html)

“`
Change Log
v2.0 – 2020.08
GORM 2.0はゼロから書き直されたもので、互換性のないAPIの変更と多くの改善が導入されています

– パフォーマンスの改善
– モジュール性の向上
– Context, Batch Insert, Prepared Statment Mode, DryRun Mode, Join Preload, Find To Map, Create From Map, FindInBatches サポートします。
– SavePoint/RollbackTo/Nested Transaction サポートします。
– 名前付き引数、グループ条件、アップサート、ロック、オプティマイザー/インデックス/コメントヒントのサポート、サブクエリの改善
– 完全な自己参照

元記事を表示

Goの関数について

##関数の基本構文
関数定義の基本形は下記のようになります。

“`
func 関数名(引数) 戻り値型 {
処理の内容…
}
“`

関数に対して引数を取り、関数の戻り値を指定して、処理内容を書いていく流れです。

##名前付き関数
では、簡単な関数を定義してみます。

“`main.go
func test(x, y int) int {
a := x * y
return a
}

func main() {
fmt.Println(test(10, 5)) //50
}
“`

関数testをint型のx, yで定義し、戻り値型にint型を指定しています。変数aに処理を代入し、returnした値をmain関数で受け取り、値を指定して出力しています。

また、戻り値は複数返すことができます。

“`main.go
func test(x, y int) (int, int) {
a := x * y
b := x / y
return a, b
}

func main() {
a, b := test(10, 5)

元記事を表示

Go言語の特徴満点なHello world

以前ツイートしていたGo言語の特徴満点なHello worldを、Qiita記事とて残しておきます。

“Hello #番号 world” を0〜99番、goroutineで並列処理して表示させる、というシンプルな目標を実装しているだけです。しかし、意外とGo言語の中枢に踏み込むコードが必要で、面白いです。

チャネルを使わないと途中で終わっちゃいますし、ちゃんとgoroutineに引数を渡してあげないと番号が重なってしまいます。実はツイートした時はこれらの対応をしておらず、今回記事化するために真面目に実行してみて、途中で終わっているとか変なことに気付きました。笑

ソース

“`Go
package main

import “fmt”

func main() {
max := 100
quit := make(chan bool, max)
for i := 0; i < max; i++ { go func(j int) { fmt.Printf("hello, #%v world\n", j) quit <- true }(i)

元記事を表示

GO公式のチュートリアル メモ 1

## 目的
– GO言語のキャッチアップのためメモ書き
– 公式が英語なので、日本語化+注釈も入れながら進める(翻訳はDeepl)

## はじめに
参考にしているサイトは[GO公式](https://golang.org)に記載されている[Wiki Tutorial](https://golang.org/doc/articles/wiki/)です。
本記事では上記URLの`Getting Started`, `Data Structures`まで扱います
チュートリアルやらずにこのページをざっと見る程度でもいいと思います

## 内容
まずはディレクトリを作成

“`
$ mkdir gowiki
$ cd gowiki
“`

>wiki.goという名前のファイルを作成し、お気に入りのエディタで開き、以下の行を追加してください。

“`wiki.go
package main

import (
“fmt”
“io/ioutil”
)
“`

– fmt…[リファレンス](http://golang.jp/pkg/fmt) フォーマットI/Oを実装するために必要な

元記事を表示

go-json-restモジュールを使って簡単にAPIサーバを作る

## リポジトリ
https://github.com/ant0ine/go-json-rest

## Hello worldを表示するプログラム

“`main.go
package main

import (
“github.com/ant0ine/go-json-rest/rest”
“log”
“net/http”
)

func main() {
api := rest.NewApi()
api.Use(rest.DefaultDevStack…)
api.SetApp(rest.AppSimple(func(w rest.ResponseWriter, r *rest.Request) {
w.WriteJson(map[string]string{“Body”: “Hello World!”})
}))
log.Fatal(http.ListenAndServe(“:8080”, api.MakeHand

元記事を表示

ローカル(ソース非公開)プロジェクトでGo言語の推奨ディレクトリ構成(golang-standards/project-layout)を使う

#### go version go1.15.2

[Go言語コミュニティの推奨ディレクトリ構成](https://github.com/golang-standards/project-layout)に従い、標準のパッケージ管理システムである「[Go Modules](https://github.com/golang/go/wiki/Modules)」を使おうとして微妙にハマった。
自サイトに同じ記事をメモとして書いたが、ツッコミが欲しくなったのてQiitaにも投下しておく。

## ディレクトリ構成例

エクスクラメーションマーク(!)が付いている名前(及び下位要素)は、任意の識別子です。

“`shell
my_project(!)
├── web # Webシステムで使うシステム外リソース。jsとか画像とか
├── assets # Webシステム以外で使うシステム外リソース。
├── cmd # mainモジュールを格納
│ ├── mainexe(!) # プロジェクト中の実行ファイル。この単位でbuild
│ │ └── main.go
│ └── c

元記事を表示

OTHERカテゴリの最新記事