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

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

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

元記事を表示

【Golang】テスト実行時に “package exec is not in GOROOT”

> Go 言語(Golang)の `testing` を使ってテストを実行すると「`exec` パッケージがない」と言われます。

“`shell-session
$ go test .
# github.com/KEINOS/Hello-World
main_test.go:5:2: package exec is not in GOROOT (/usr/local/go/src/exec)
FAIL github.com/KEINOS/Hello-World [setup failed]
FAIL
“`

意外なことに[「”golang” package exec is not in GOROOT」とググって](https://www.google.com/search?q=%22golang%22+package+exec+is+not+in+GOROOT)も、当然すぎるのか、すぐに見つからなかったので自分のググラビリティとして。

– go version go1.15.3

## TL; DR

> `exec` は `os` パッケージの一部です。`exec` →

元記事を表示

[Go] echoフレームワークで Response Body (レスポンス ボディ) を取得するアレな方法

## まえがき

上司たそ「@syamamura くん。エラーログ出して欲しいんだけど、トレースログとエラーコード。ロギングしといて。よろしく」
ぼく「はぁい」

エラーコードは??**紆余曲折**??の末、決定される仕様なため✨?**綺麗**?✨に取得するには**レスポンス**から取るしかないことに気づく。

エラー時のみハンドリングしたかったとか、ログにトレースログを含める必要があったとか、そんな理由で実装した。
**困った人**向け。

文字通りアレな方法だと思うので、単純に Response Body を取得したいだけの**困ってない人**は[middleware/body-dump](https://echo.labstack.com/middleware/body-dump)を使ったほうが良いと思う。

## 困った人。

Response Body を取得したいけど Response は stream 的なものに書き込まれてるっぽくって後から取得しようとしてもできなかった。
なので `Context.Response().Writer` をトラップ付き Writer

元記事を表示

gRPCとFirebase Authenticationで認証処理

# はじめに
gRPCとFirebase Authenticationを使用したGoサーバでの認証処理のやり方を紹介します。認可処理についてはまた別記事で書く予定です。

# Firebase Authentication
SDKの追加は以下のコマンドからできます。

“`shell
go get firebase.google.com/go
“`

Firebase Admin SDK for Go の初期化は以下を参考にします。
[サーバーに Firebase Admin SDK を追加する](https://firebase.google.com/docs/admin/setup?hl=ja#initialize_the_sdk)

従来は“`option.WithCredentialsFile()“`を使用した初期化が一般的だったようですが、GOOGLE_APPLICATION_CREDENTIALS 環境変数を使用する初期化を強くお勧めしているようです。

“`go:firebase.go
package middleware

import (
“context

元記事を表示

converting argument $1 type: unsupported type []string, a slice of stringに悩まされた話

#概要
エンジニア1年目の初投稿です。
sqlxを使ってDB操作をしていたら、下記のエラーに悩まされたので記録します。
コメント、ダメ出しなど頂けると嬉しいです。

“`
converting argument $1 type: unsupported type []string, a slice of string
“`

# シナリオ

SELECT文のWHERE句にIN条件を使った操作を行おうとしていたところ、エラーに嵌まりました。
今回は,以下のUSERテーブルからgoとpythonを使えるUSERを抽出する操作を書いていきます。

| Name | Skill |
| — | — |
|Ichiro| C |
| Jiro | C# |
|Saburo| Java |
|Shiro | python|
|Goro | go|
|Rokuro| Ruby|
|Shichiro|go|

## 各種ツール

– go 1.14
– github.com/jmoiron/sqlx v1.2.0
– github.com/go-sql-driver/mysql v1

元記事を表示

Go Moduleでローカルで作成したパッケージを読み込む

Goを勉強し始めました。
本を使って勉強しているのですが、基本的にバージョンが古いです。
ですので、Go Moduleを使ったファイル構成になっていないのがほとんど。

しかし、今後のバージョンアップでModuleを使う動きになっていく流れになっていくそうです。
ですので、初心者でもModuleを使って開発がしたいと思いまして、イジイジしてたのですが、思ったよりも苦戦しました…

特にローカルで作ったパッケージを、他のファイルにimportする方法がわからず苦戦。
同じエラーで苦しむ人を減らすべく、記事を書こうと思いました。

## Go Moduleとは
パッケージ管理ツールです。
Go 1.11以前では`$GOPATH/src/`配下にソースコードを置かないとローカルで作ったパッケージなどをうまく扱えなかったのですが、`go module`を使えばどこのディレクトリからでも、パッケージ管理ができるようになったらしいです。
nodeのpackage.jsonみたいなものですかね。
なので、環境変数のパスに依存せずにプロジェクトを作ることが可能です。

## 導入
Version

元記事を表示

OTHERカテゴリの最新記事